ファクトリーガールの紹介FactoryGirl.build()
とFactoryGirl.create()
の違いを説明します。
# Returns a User instance that's not saved
user = FactoryGirl.build(:user)
# Returns a saved User instance
user = FactoryGirl.create(:user)
両者の実際的な違いはまだわかりません。誰かがあなたが一方を使用し、他方を使用しない場合の例を与えることができますか?ありがとう!
create()
メソッドはモデルのインスタンスを保持しますが、build()
メソッドはメモリ上にのみ保持します。
個人的に、create()
メソッドを使用するのは、DBへの書き込みがテストに時間がかかるため、永続性が本当に必要な場合のみです。
例えば.
私の認証エンジンはDBをクエリするため、create()
で認証するユーザーを作成します。
モデルに属性があるかどうかを確認するには、DBアクセスが必要ないため、build()
メソッドが実行します。
it{Factory.build(:user).should respond_to(:name)}
「アソシエーションを構築しているときに、実際に構築する「作成」という例外が1つあります。つまり、アソシエーションはメモリ内に存在せず持続します。それを覚えておいてください」– Shakes
FactoryGirl.build(:factory_name)
を使用してもdbには保持されず、_save!
_が呼び出されないため、Active Record検証は実行されません。これははるかに高速ですが、検証が重要になる場合があります。
FactoryGirl.create(:factory_name)
を使用すると、データベースが保持され、Active Record検証が呼び出されます。これは明らかに遅いですが、検証エラーを見つけることができます(テストでそれらを気にする場合)。
FactoryGirl.create()
は、新しいオブジェクトとその関連付け(ファクトリーにある場合)を作成します。それらはすべてデータベースに保存されます。また、モデルとデータベースの両方の検証をトリガーします。コールバックafter(:build)
およびafter(:create)
は、ファクトリーが保存された後に呼び出されます。また、ファクトリが保存される前にbefore(:create)
が呼び出されます。
FactoryGirl.build()
はオブジェクトを保存しませんが、ファクトリにアソシエーションがある場合はデータベースへのリクエストを行います。関連付けられたオブジェクトに対してのみ検証をトリガーします。コールバックafter(:build)
は、ファクトリーの構築後に呼び出されます。
ほとんどの場合、モデルをテストするときはbuild_stubbed
パフォーマンスを向上させます。詳細については こちら をご覧ください。