web-dev-qa-db-ja.com

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

ファクトリーガールの紹介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)

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

87
Avery

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

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

例えば.

私の認証エンジンはDBをクエリするため、create()で認証するユーザーを作成します。

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

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

更新

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

108
Helio Santos

FactoryGirl.build(:factory_name)を使用してもdbには保持されず、_save!_が呼び出されないため、Active Record検証は実行されません。これははるかに高速ですが、検証が重要になる場合があります。

FactoryGirl.create(:factory_name)を使用すると、データベースが保持され、Active Record検証が呼び出されます。これは明らかに遅いですが、検証エラーを見つけることができます(テストでそれらを気にする場合)。

12
chasm

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

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

ほとんどの場合、モデルをテストするときはbuild_stubbedパフォーマンスを向上させます。詳細については こちら をご覧ください。

1
Nesha Zoric