2010-01-05 36 views
5

我正在使用Shoulda与Test :: Unit组合在我工作的其中一个项目上。我遇到的问题是,我最近改变了这一点:Shoulda:测试validates_presence_of:on =>:更新

class MyModel < ActiveRecord::Base 
    validates_presence_of :attribute_one, :attribute_two 
end 

这样:

class MyModel < ActiveRecord::Base 
    validates_presence_of :attribute_one 
    validates_presence_of :attribute_two, :on => :update 
end 

以前,我(通过)的测试是这样的:

class MyModelTest < ActiveSupport::TestCase 
    should_validate_presence_of :attribute_one, :attribute_two 
end 

由于据我所知,没有参数should_validate_presence_of将导致此测试继续通过上述指定的更改。在测试:attribute_two的要求时,放弃Shoulda是否有办法解决这个问题?

回答

2

在过去的我刚刚用一个小的自定义应该阻止来解决这个问题:

should "require :attr_two on update" do 
    mm = Factory(:my_model) 
    mm.attr_two = nil 
    mm.save 
    assert_equal false, mm.valid? 
    assert_equal("can't be blank", mm.errors.on(:attr_two)) 
end 

希望早该将继续允许在未来进一步AR验证选项改善。让我知道你在想什么,欢呼。

2

我试过类似于tsdbrown建议的解决方案。这种类型的测试通过时,我有:
validates_presence_of:attr_two

但如果我更改模型,以测试失败:
validates_presence_of:attr_two,:上=>:保存

它失败,因为: attr_two错误是[]而不是[ “不能为空”]

2

在Rspec的,你可以做到以下几点:

describe MyModelTest do 
    describe "validations" do 
    should_validate_presence_of :attribute_one 

    context "on update" do 
     subject { FactoryGirl.create(:my_model_test) } 

     should_validate_presence_of :attribute_two 
    end 
    end 
end 
3

什么像THI S' (用于shoulda-matchers-3.1.1

subject { FactoryGirl.build(:your_model) } 
it { is_expected.to validate_presence_of(:attribute_one) } 
it { is_expected.to validate_presence_of(:attribute_two).on(:update) } 
相关问题