2012-02-17 10 views
49

私は工場ガールを使用して、グループのモデル/ユニットテストで2つのインスタンスを作成しています。私は私のモデルバリデーションをバイパスする工場少女の作成

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group, :expiry => Time.now + 1.week) } 
    let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 

    specify { Group.current.should == [current_group] } 
    end 

私の問題は、私はモデルで検証を持っているということです...呼び出しは以下のとおり有効期限の属性に応じてのみ、「現行」グループのリターンを.currentすることを確認するためにモデルをテストしています新しいグループの有効期限をチェックするのは、今日の日付以降です。これにより、以下の検証エラーが発生します。

1) Group.current 
    Failure/Error: let!(:expired_group) { FactoryGirl.create(:group, :expiry => Time.now - 3.days) } 
    ActiveRecord::RecordInvalid: 
     Validation failed: Expiry is before todays date 

Factory Girlを使用して強制的にグループを作成したり、検証を回避する方法はありますか?

答えて

62

これはFactoryGirlに非常に具体的ではありませんが、save(:validate => false)を経由してモデルを保存するときは、必ず検証をバイパスすることができます:

describe ".current" do 
    let!(:current_group) { FactoryGirl.create(:group) } 
    let!(:old_group) { 
    g = FactoryGirl.build(:group, :expiry => Time.now - 3.days) 
    g.save(:validate => false) 
    g 
    } 

    specify { Group.current.should == [current_group] } 
end 
+0

私は感謝、探していた正確に何が! – Norto23

+0

より良い解決策については、下記のJason Denneyの答えをご覧ください。 –

5

この特定の日付-baesd検証ケースについて、あなたはまた、一時的にtimecop宝石を使用することができます過去に作成された古いレコードをシミュレートする時間を変更します。

1

状況によっては、更新時にのみ検証が変更される可能性があります。例::validates :expire_date, :presence => true, :on => [:update ]

46

私はこの解決策をhttps://github.com/thoughtbot/factory_girl/issues/578よりも好む。工場内

to_create {|instance| instance.save(validate: false) } 
+4

これは受け入れられたものよりはるかにエレガントな解決策です。 –

+3

汎用ファクトリでこれを行った場合は、そのファクトリで作成したときに毎回バリデーションをスキップすることになります。おそらくこの手法は、サブファクトリ(または特性)でのみ使用するのが最善です。 – tgf

+0

これはほとんどの場合、これを特性に入れたいと思うでしょう。下のTim Scottの答えを見てください。 –

3
foo = build(:foo).tap{ |u| u.save(validate: false) } 
6

これは、工場でデフォルトで検証をスキップする悪い考えです。いくつかの髪はそれを見つけることが引き出されます。

素敵な方法で、私は思う:あなたのテストで続いて

trait :skip_validate do 
    to_create {|instance| instance.save(validate: false)} 
end 

create(:group, :skip_validate, expiry: Time.now + 1.week) 
+0

これがこの問題を解決する最善の方法です! –

関連する問題