应该:测试validates_presence_of:on => :更新

时间:2010-01-05 21:19:46

标签: ruby-on-rails unit-testing shoulda

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

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,有什么方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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 :(得分:2)

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

validates_presence_of :attr_two

但如果我将模型更改为:

,则测试失败
validates_presence_of :attr_two, :on => :save

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

答案 3 :(得分: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