应该:测试validates_presence_of:on =>:update

我在我工作的一个项目中使用了Shoulda和Test :: Unit。 我遇到的问题是我最近改变了这个:

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

对此:

 class MyModel  :update end 

以前,我的(传递)测试看起来像这样:

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

据我所知, should_validate_presence_of没有参数会导致此测试继续传递上面指定的更改。 在测试需求:attribute_two ,没有放弃Shoulda,有什么方法可以解决这个问题吗?

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

 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 

希望将来通过允许进一步的ARvalidation选项,shoulda将继续改进。 让我知道你的想法,干杯。

这样的事情怎么样? (对于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) } 

在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 

我尝试过类似于tsdbrown建议的解决方案。 当我有这样的测试时:

 validates_presence_of :attr_two 

但是如果我将模型更改为:

 validates_presence_of :attr_two, :on => :save 

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