2011-03-03 5 views
57

before(:each)ブロックを使用できるとき、rspecテストでFactory Girlの目的は何ですか?ファクトリーガールとbefore(:each)の唯一の違いは、ファクトリがテスト外でオブジェクトの作成を準備していることです。これは正しいですか?工場の女の子 - 目的は何ですか?

+0

をしたい場合、これがFactoryGirlはActiveReccord https://cbabhusal.wordpress.com/2015/04/21/ruby-on-rails-factoryとの対話方法で非常によく主題をカバー-girl-how-it-interactrecord-with-activerecord/ – illusionist

答えて

59

Factory GirlShamのような宝石は、有効で再利用可能なオブジェクト用のテンプレートを作成することを可能にします。それらはデータベースにロードされなければならない固定レコードがある場所に対応して作成されました。オブジェクトをインスタンス化するときに、より多くのカスタマイズが可能になり、有効なオブジェクトを確実に確保することを目指します。あなたのテストのどこにでも、テストフックの前後にも使用できます。

before(:each)、before(:all)、after(:each)、after(:all)はすべて、テストグループ内で共有されるセットアップとティアダウンを行う場所を提供します。たとえば、1回のテストごとに新しい有効なユーザーを作成する場合は、前の(:each)フックでこれを実行するとよいでしょう。あなたがファイルシステムからいくつかのファイルを消去しようとするならば、前のフックでそれをしたいと思っています。あなたのテストがすべてtmpファイルを作成し、テスト後に削除したい場合は、after(:each)またはafter(:all)フックで行います。

これらの2つの概念が異なる点は、ファクトリがテストの周りにフックを作成することではなく、有効なRubyオブジェクトとレコードを作成することを目的としているためです。前後のフックは、サンプルグループで共有されるセットアップとティアダウンの作業を目的としているため、セットアップとティアダウンコードをDRY状態に保つことができます。

+7

これを言う別の方法:FactoryGirlファクトリは、 'give_me_a_valid_model'ファンクションのようなものです。もしあなたが複数の 'before:each'ブロックでそれを必要とするなら、それはあなたにいくつかの繰り返しを保存します。有効なモデル(関連付け、独自の値の確保など)を設定することが複雑になればなるほど、それはあなたの労力を節約します。 –

17

FactoryGirlはテストでフィクスチャを置き換えます。この方法では、データモデルを変更するときにフィクスチャを最新の状態に保つ必要はありません。また、より多くのエッジケースを追加すると、フィクスチャが扱いにくくなる傾向があります。

FactoryGirlはオンザフライでデータを生成し、フィールドの追加と削除はずっと簡単です。また、フィクスチャを使用する方法だけでセットアップで使用できます。

それが明確になりますか?

+2

工場が治具の「スマートな」代替品であることを理解するために、しばらく私を見ました。私はまだモックとスタブの違いについてもっと学ぶことに興味があります。 – Docunext

+0

確かに、ありがとうございます。 :)彼らが器具の良い代替品であることを知っておいてよかった。ハートルのチュートリアル(良い、btw)が器具とファクトリーガールの間を出入りしていたので少し奇妙でした。私は自分自身が混乱していると感じました。今私が知っている、私はおそらくより頻繁にそれを使用します。 :) – curiousdork

6

また、フィクスチャ定義はアプリケーション全体でグローバルです。ファクトリはローカルにすることができます。そのため、孤立したテストケース固有のデータは、その特定のコンテキストに対して設定され、単一のグローバルフィクスチャファイルには設定されません。

This bookは、あなたが問題でいくつかのより多くの読書

関連する問題