FactoryGirlのビルドメソッドと作成メソッドの違いは何ですか?


94

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)

両者の実際的な違いはまだわかりません。誰かがあなたが一方を使用したいが他方を使用したくないという例を与えることができますか?ありがとう!

回答:


115

create()一方、この方法は、モデルのインスタンスを永続化build()する方法は、専用メモリ上に保持します。

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

例えば

create()私の認証エンジンがDBにクエリを送信するので、認証に使用するユーザーを作成します。

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

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

更新

「アソシエーションを構築しているときにbuildが実際に「作成」するという例外が1つあります。つまり、アソシエーションがメモリに存在しなくなり、永続化されます。それを覚えておいてください」– Shakes


14
アソシエーションを構築しているときにbuildが実際に「作成」するという例外が1つあります。それを覚えておいてください
シェイク2014

@Shakes、私はもはやレールで働いていません。できるだけ早く確認します。
Helio Santos

の各インスタンスをcreateで置き換えるツールを作成しbuild、テストが失敗した場合に元に戻すツールはありますか?
mgold

#create永続化されたオブジェクトをディスクから読み取って返しますか、それとも永続化した後にメモリ内にあるオブジェクトを返しますか?つまり、はとcreate(...)同等のことをしていcreate(...).reloadますか?
Dennis

@mgold Vimは、そのようなことにかなり優れています。
償いの制限

15

の使用FactoryGirl.build(:factory_name)はdbに永続化せず、を呼び出さないsave!ため、アクティブレコードの検証は実行されません。これははるかに高速ですが、検証が重要になる場合があります。

を使用FactoryGirl.create(:factory_name)すると、dbが保持され、アクティブレコードの検証が呼び出されます。これは明らかに遅くなりますが、検証エラーをキャッチできます(テストでそれらを気にする場合)。


11
または、単にFactoryGirl.build(:factory_name).validを実行できますか?データベースに保存せずに検証を実行します。
jinavar1 2014年

1

FactoryGirl.create()新しいオブジェクトとその関連(ファクトリにある場合)を作成します。それらはすべてデータベースに永続化されます。また、モデルとデータベースの両方の検証がトリガーされます。コールバックafter(:build)after(:create)ファクトリが保存された後に呼び出されます。またbefore(:create)、ファクトリが保存される前に呼び出されます。

FactoryGirl.build()オブジェクトを保存しませんが、ファクトリに関連付けがある場合は、データベースへのリクエストを行います。関連するオブジェクトに対してのみ検証をトリガーします。コールバックafter(:build)は、ファクトリがビルドされた後に呼び出されます。

ほとんどの場合、モデルをテストすることbuild_stubbedがパフォーマンスを向上させるために最も適していることに注意してください。詳しくはこちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.