テストでフィクスチャを置き換えることを目的とする Rails プラグインは多数あります。ここに私が考えることができるいくつかがあります:
- 器具の交換
- 工場の女の子
- 工場と労働者
- レールシナリオ
- 備品シナリオ
- オブジェクトパパ
おそらく他にもあります。これらのプラグインのうち、どのプラグインが好きですか? その理由は?
テストでフィクスチャを置き換えることを目的とする Rails プラグインは多数あります。ここに私が考えることができるいくつかがあります:
おそらく他にもあります。これらのプラグインのうち、どのプラグインが好きですか? その理由は?
私は個人的にカスタム Factory クラスでFakerを使用しています。これにより、ファクトリを作成し、生成されたインスタンスに非静的データを入力できます。
# spec/factory.rb
module Factory
def self.create_offer(options={})
Offer.create({
:code => Faker::Lorem.words(1),
:expires_on => Time.now + (rand(30) + 1).day
}.merge(options))
end
end
# spec_helper.rb
require 'faker'
require 'spec/factory'
# In the specs
@offer = Factory.create_offer(:code => 'TESTING')
Factory Girlにもプラスワンを与えることができます. 複数のファクトリ間で関連付けることができる方法は、ある程度通常のモデル セットがある場合に非常に役立ちます。たとえば、プロジェクトには 1 人のプロジェクト マネージャーがいます。
Factory.define :project_manager do |f|
f.first_name "John"
f.last_name "Doe"
end
Factory.define :project do |f|
f.name "Sample Project"
f.association :project_manager
end
そうすれば、各テストで実際に関係を設定することについて心配する必要がなくなります。また、Factory.sequence を使用して工場でサンプル データを構築できる Faker のような作業も実行できます。Factory Girl に関するすべての情報については、http://dev.thoughtbot.com/factory_girl/ をご覧ください。
私はフィクスチャの交換を提唱します 2 . デフォルトの (気にしない) モデル属性はすべて 1 か所 (db/example_data.rb) に保存され、迅速に有効なオブジェクトを提供します。作成時に指定した属性は、デフォルトの属性をオーバーライドします。つまり、関心のあるデータはtestにあり、他には何もありません。
サンプル データは、遅延評価の proc によって表される他のデフォルト モデルを参照することもできるため、必要に応じて関連付けを簡単にオーバーライドできます。
new_*, create_*, and default_*
バージョン 2 では、すべてのモデルに魔法のメソッドを提供しながら、よりクリーンな定義形式を提供します。
後で読むのが難しいテストデータをますます構築することを奨励するような「シナリオ」スキームは避けたいと思います。FR2 を使用して名前付き (カスタム) オブジェクトを作成できますが、その必要性を見つけたことはありません。
PSユニットテスト戦略も検討してください-フィクスチャとそのすべての類似物は、DBにヒットする実際のオブジェクトであり、機能テストまたは統合テストを行います。現在、RSpec のモッキングとstub_model()
最新のunit_record gem を使用して、DB アクセスを禁止しています。
1つまたは少数のオブジェクトのみが必要な場合、私はファクトリの大ファンです。自分で書くか、ThoughtbotのFactoryGirlを使用することができます。
相互に関連するオブジェクトのキュレートされたセットが必要な状況では、フィクスチャはファクトリを打ち負かします。フィクスチャをかなり乾燥させて管理しやすくする優れたLiteフィクスチャを確認する必要があります。
+1 ファクトリーガール
プロジェクトで Factory Girl を使い始めたところです。そのやり方は、私たちの自家製ソリューションとそれほど変わらないので、うまく機能しています。
Ryan Bates の Populator gem と一緒に Faker を使用しています。彼はhttp://railscasts.com/episodes/126-populating-a-databaseに素敵なスクリーンキャストさえ持っています。
私は最近機械工と遊んでいて、それを掘っています。
ファクトリーガールはいいぞ。作業負荷で使用します。
Factory.define :usa, :class => Team do |f|
f.country_name 'USA'
f.rank 15.6
end
Factory.define :player do |f|
f.first_name 'Stevie'
f.last_name 'Wonder'
f.team Factory.build(:usa)
end
次に、仕様で、Factory.build(:usa)
またはを使用Factory.create(:usa)
して、それぞれ USA チームを構築または作成できます。