10

テストで ActiveRecord を使用してデータベース エントリを作成できる場合、ファクトリ/フィクスチャの目的は何ですか (ファクトリがフィクスチャのように機能することは知っていますが、もう少し明確です)。すなわち News.create(…)

ActiveRecordメソッドを使用して新しいユーザーを作成するだけでなく、Factory Girlを使用する利点がわかりません..

ありがとう

4

3 に答える 3

5

工場

オブジェクトを作成/ビルドし、テストで呼び出されたときにのみ使用します。

アソシエーションを含むオブジェクトの「ハッピーパス」を1つのファイルで定義し(ライアンが述べたように)、スキーマ/モデルのアソシエーションが変更されたときに1つのファイルを維持するだけです。

備品

データベースが単一のレコードに対してどのように見えるかを模倣し、テスト データベースにロードされてから使用されます。

フィクスチャはモデルの最終状態であり、データベースに存在するため、一度ロードされ、必要に応じてテストで使用できます。

複数のファイルがあり、各ファイルと関連付けが処理されるようにフィクスチャ ファイルをレイアウトします。

NewModel.create(...)

before(:each)1 回のテストまたは 1 つのブロックで 1 回作成され、1 回使用される

@user.profile.create(....)これらのブロックが 100 個ある場合、 100 回の関連付けは言うまでもなく、100 個の異なるオブジェクトを作成して維持することになります。

NewModel.create に対するファクトリの利点

build複数のコード行やコード行をgrep して置き換えるのではなく、1 つのファイルを維持createします。

私のテスト スイートでは、可能な限り高速にしたいので、FactoryGirl を削除し、Fixtures と NewModel.create を使用しています。それがそれをスピードアップするかどうかを確認するだけです。私は、FG がスイートの速度を低下させているという理論に取り組んでいますlet()before(:each)

于 2012-12-22T12:34:51.730 に答える
4

工場を持ち、テストデータ構築パターンに従うことで、前もって少し作業を行うことができますが、将来の時間と作業を本当に節約できます。

あなたが車のモデルを持っていて、その車に所有者がいて、その所有者が住所を必要としているとしましょう。また、それらのそれぞれには他のフィールドがあります。モデルを直接使用するアプローチに従う場合は、それらを必要とする各ステップ定義でそれらのオブジェクト(および対応するリレーション)を作成する必要があります。工場で?一度だけ定義します。

対応する構造を持つ単一の場所でファクトリを定義したら、車を要求するだけで、ファクトリは他のモデルとのすべての依存関係の車を取得します。かっこいいじゃないですか。最後に、この時点でテストに集中したいと思います。

また、本当にすばらしいのは、特定の属性を上書きできることです。したがって、属性の速度を上書きしたい場合は、たとえば次のようなものがあります。

Given /^I have a car running^/
 Factory :car, speed => 100
end

私の謙虚な観点から、私はFactory Girlが大好きです。それは、テストコードを管理しやすく、本当に読みやすいからです。

于 2012-04-14T17:05:08.537 に答える
2

工場では、テストセットアップを1つのファイルにまとめることができます。たとえば、私のプロジェクトファクトリはにありspec/support/factories/project_factory.rbます。

デフォルトのタイトルを変更したい場合、または別の属性を追加したい場合は、1つのファイルでそれを行います。テスト全体でARが飛び散っていたので、その使用のすべてのインスタンスでARを変更する必要があります。

于 2012-04-14T16:43:23.150 に答える