2012-04-14 8 views
8

テストでActiveRecordを使用してデータベースエントリを作成するだけでは、工場/什器の目的は何ですか(私は工場が什器のように機能しますが、少しはっきりしています)。すなわちNews.create(...)ファクトリー/フィクスチャvs単純なModel.create(...)?

私はちょうどファクトリー・ガールを使用しての代わりに、任意の利点は、単に新しいレットを作成して表示されていないがActiveRecordのメソッドを使用して、新しいユーザーを言う..

答えて

2

工場を持って、あなたはアップフロントの仕事を少しやるようになりますテストデータの構築パターンを以下のが、本当に将来的にあなたの時間と作業を保存します。

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

ファクトリを対応する構造を持つ単一の場所に定義したら、Carを要求するだけで、他のモデルとのすべての依存関係を取り除くことができます。それはクールではないですか?最後に、はこの時点でのテストに集中します。の私の謙虚な視点から

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

:それも本当にクールだ何

は、あなたがこのような例で何かを持っているかもしれないので、あなたは属性速度を上書きしたい場合は、、特定の属性を上書きすることができるということですファクトリーガールが大好きなのは、テストコードを簡単にして読みやすくすることができるからです。

+2

対抗詞:これらの引数はすべて備品にも適用されます。治具全体がより速くなります。その他の理由は? – DGM

+0

@DGM私が使用しているにもかかわらず、私は備品が好きですが、いつか維持するのが難しいと感じます。 –

2

工場が許可

感謝テストセットアップを1つのファイルに入れます。たとえば、私のプロジェクト工場はspec/support/factories/project_factory.rbです。

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

5

工場

は/オブジェクトを構築し、その後、あなたはテストの際に呼び出されたときにのみ、それを使用し作成します。

アソシエーションを含むオブジェクトの「ハッピーパス」を1つのファイルに定義し、スキーマとモデルの関連付けが変更されたときのファイルを1つだけ維持します。

備品データベースは、単一のレコードに対してどのように見えるか

ミミック、それはテスト・データベースにロードされ、その後、使われています。

フィクスチャは、モデルの終了状態であり、データベースに保存されているため、一度読み込まれ、適切にテストで使用できます。

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

NewModel.create(...)

はそれが執筆し、100種類のオブジェクトを維持し、ましてや@user.profile.create(....) 100回のような関連付けされ、一度作成し、これらのブロックの100を持っている場合は一つのテストでまたは1つのbefore(:each)ブロック

で一度使用されています。むしろ、コードのあなたの行に複数のbuildまたはcreateをgrepをして交換するよりも、維持するために、ファイルの一つ

NewModel.create以上の工場の

利点。

私のテストスイートに私はそれが可能な限り迅速になりたいと言われなければならないので、私がfactorygirlをドロップし、備品を使用してNewModel.createが前進しています。それがスピードアップしているかどうかを確認するだけです。私はFGがスイートを減速させているという理論に取り組んでいます。let()before(:each)