工厂女孩创build绕过我的模型validation

我正在使用Factory Girl在我的模型/unit testing中为一个组创build两个实例。 我正在testing模型来检查.current调用根据下面的expiry属性只返回“当前”组…

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 

我的问题是我已经在模型中validation了新组的到期date是在今天的date之后。 这提高了下面的validation失败。

  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 

有没有办法强制创build团队,或者在创buildFactory Girl时避开validation?

这不是FactoryGirl特有的,但是当通过save(:validate => false)保存模型时,你总是可以绕过validation:

 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 

我更喜欢这个解决scheme从https://github.com/thoughtbot/factory_girl/issues/578

工厂内部:

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

对于这个特定的datevalidation案例,您也可以使用timecop gem临时更改时间以模拟过去创build的旧logging。

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

根据你的情况,你可以改变validation只发生在更新。 例如:: :validates :expire_date, :presence => true, :on => [:update ]

在工厂默认跳过validation是一个坏主意。 有些头发会被拉出来发现。

最好的方式,我想:

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

然后在你的testing中:

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