FactoryBotの可読性
Railsのテストでは当たり前のようにつかうFactoryBot。
RequestSpecを書いていく中でも使っていたが、可読性が良くないのではと思い、テストを書いてみた。
まだエンジニアとして働き始めて一ヶ月です。ご指摘など有りましたら、ご連絡やコメント下さい。
よろしくお願いします。
なんのためのテスト?
API側の受け取るテストを書いていく。
Rails側でjsonデータを受け取り、正しい挙動を示すのかどうかを判断するテスト
FactoryBotを使って、定義する
よくやる定義 FactoryBotを定義して、Rspecのテストで使う
Factory.define do factory :posts do title { 'テスト'} describe { 'テストの中身'} link { 'https://example.com' } file { test.uuid } alt { 'sample_image' } user { FactoryBot.create(:user) } end end
今回確認したいこと
jsonで渡すデータが正しいのかどうか?
indexやshowアクションのテストについて考えてみる
indexやshowの場合は、FactoryBotを使っても問題ない
なぜなら、レコードの表示やステータスの確認といったようなテストが想定されるから。
createやupdateアクションでは?
予想されるテストは、正しい値と誤った値を渡したときにどういった挙動になるのか
StrongParameterの形に沿って、テストを書いていく
下記のような形が定義される。
indexやshowと書き方が異なるのは、前回は型がHash。今回は、jsonになるから。
さらに、StrongParameterに沿った形のformにする必要がある。↓
params.require(:post).permit(:title, describe, link, file, alt)
こんな形に定義をした
Factory.define do factory :create_post do { post: { 'title' { 'テスト'}, 'describe' { 'テストの中身'}, 'link' { 'https://example.com' }, 'file' { test.uuid }, 'alt' { 'sample_image' }, }, } end end
確認観点
- StatusCodeが返却されること
- responseのタイプがjsonであること
- 正しくない場合(異常値)のエラーメッセージが返却されること
- 値が作成、更新されること
値が正しいか間違いかを定義する場合に、毎回FactoryBotを見に行く必要がある。
今回は、specファイルに直書きすることとした。
let(:create_post) do { post: { 'title' { 'テスト'}, 'describe' { 'テストの中身'}, 'link' { 'https://example.com' }, 'file' { test.uuid }, 'alt' { 'sample_image' }, }, } end
特に、間違った値をテストするときやstatusの値を変更する場合には、分かりづらいことがあるので、FactoryBotへ必ず定義するのではなく、ケースバイケースで良いのかもしれない。
今回学んだこと
- みやすさ重視で、FactoryBotに必ず書く必要はない。
- json型の値の受け渡し型
拙い文章ですが、誰かの助けになれば幸いです。 なにか間違い等ありましたら、ご指摘ください!