rspecでFactryBotを作成する時大切な話

プログラミングを本格的にスタートして3ヶ月目に入りましたさかもとです。

今回はモデルでrspeckでFactryBotを作成する際に大切なこと!という話をアウトプットしようと思います。

 

FactryBotとは

rspecでuserやprojectなどを定義する際にテスト毎に作成していてはテストをDRYに保てないので別ファイルで予め定義したものも実際のテストで使い回すためのgem

 

使い方

1.  gem "factory_bot_rails"を導入

2.  bin/rails g factory_bot:model モデル名 でファイルを作成

3.  spec/factries/モデル名.rbに定義したいユーザー情報を入力

4.  spec/models/モデル名_spec.rb で定義したい情報を入力する際に expect(FactoryBot.build(:user)).to be_valid のように記載

 

シーケンス を使ってユニークなデータの生成

FactryBotはとても便利ですがよくない点もあります。

それは使い方で定義した状態でユニークな情報に対してテストを実行してもerrorが発生する点です。

emailなど重複してはいけない情報に関しては明示的にこちらで定義しなくてはなりません。

そんな時にFactoryBotに新たに情報を定義していてはきりがありません。

そこで役に立つのがシーケンス !

FactoryBot内で email "kk@example.com" のように定義していたものをsequence(:email) { |n| "kk#{n}@example.com" } のように定義します。

こうすることで実際に生成されるのは email "kk1@example.com" のようになります。

こうすればいちいち定義しなくても勝手に違う情報が生成されます。

 

関連を扱おう

例えば user, project, note.rbファイルがあるとします。

noteはprojectとuser両方に属しています。

しかしテストのたびに両方を作成するのはあまり好ましくありません。

そこで下記のようにuserにownerという別名(alias)を記述します。

 

factory :user, aliases: [:sample] do

 first_name "kk"

 last_name "kk"

 sequence(:email) { |n| "kk#{n}@example.com" }

 password "kkkk"

end 

さらにnotes.rbには

user { project.sample }と記述します。

これで何度も生成されることがなく一回書くだけで生成されます。

 

重複は継承することで極力なくそう

FactoryBotでは一度定義したものに対して変更点だけを定義することで初めに定義した変更点以外の情報を引き継ぐことができます。

これはDRYに保つため、可読性の双方が上がるので要チェック