駆け出しエンジニアの気ままブログ

気になったことについて、調べながら投稿するブログです。

FactoryBotの可読性について

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アクションのテストについて考えてみる

  • StatusCodeが返ってくること
  • responseのタイプがjsonであるか
  • bodyの要素数(indexで複数ポストがあること)
  • idが実在しているかどうか

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型の値の受け渡し型

拙い文章ですが、誰かの助けになれば幸いです。 なにか間違い等ありましたら、ご指摘ください!