105

Factory Girl の紹介では、 と の違いを説明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)

私はまだ2つの実際的な違いを理解していません。一方を使用し、もう一方を使用したくない例を誰かが挙げることができますか? ありがとう!

4

3 に答える 3

136

メソッドはモデルのcreate()インスタンスを保持しますが、build()メソッドはモデルをメモリにのみ保持します。

個人的にcreate()は、DBへの書き込みはテストに時間がかかるため、永続性が本当に必要な場合にのみこのメソッドを使用します。

例えば

create()認証エンジンがDBにクエリを実行するため、認証に使用するユーザーを作成します。

モデルに属性があるかどうかを確認するには、build()DBアクセスが必要ないため、メソッドが実行します。

it{Factory.build(:user).should respond_to(:name)}

アップデート

「アソシエーションを構築するときに、ビルドが実際に「作成」する例外が1つあります。つまり、アソシエーションはメモリに存在しなくなり、永続化されます。この点に注意してください」–シェイク

于 2013-01-04T21:03:01.120 に答える
17

UsingFactoryGirl.build(:factory_name)はデータベースに保持されず、 を呼び出さないsave!ため、Active Record の検証は実行されません。これははるかに高速ですが、検証が重要になる場合があります。

UsingFactoryGirl.create(:factory_name)はデータベースに保持され、Active Record 検証を呼び出します。これは明らかに遅くなりますが、検証エラーをキャッチできます (テストでそれらを気にする場合)。

于 2013-08-01T19:51:59.937 に答える