6

在我从事的一个项目中,我将 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,有什么办法解决这个问题吗?

4

4 回答 4

7

这样的事情呢?(对于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) }
于 2016-07-13T11:52:10.457 回答
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 验证选项来不断改进。让我知道你的想法,干杯。

于 2010-01-06T10:38:42.517 回答
2

我尝试了类似于 tsdbrown 建议的解决方案。当我有以下情况时,这种类型的测试通过:

validates_presence_of :attr_two

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

validates_presence_of :attr_two, :on => :save

它失败是因为 :attr_two 错误是 [] 而不是 ["can't be blank"]

于 2011-01-28T00:12:08.863 回答
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
于 2013-02-21T14:43:32.183 回答