模型不一致地跳过'验证'?

时间:2013-09-17 03:12:35

标签: ruby-on-rails rspec mongoid

使用Rails 4 / Mongoid,我有一个名为MyClass的模型,其验证定义为:

class MyClass
  include Mongoid::Document

  ...some attributes...

  before_validation :prevalidate

  def prevalidate
    self.required_prop = false if self.required_prop_two
  end
  validate do |instance|
    puts 'VALIDATING'
    ...some more validation...
  end
end

然后我有两个Rspec测试,其中只有一个打印'VALIDATING':

# This test fails, and does not print 'VALIDATING'
it 'is an invalid instance' do
  instance = Fabricate.build(:my_class)
  instance.required_prop = nil
  instance.required_prop_two = nil
  instance.should have(1).errors_on(:required_props)
end
# This test passes, and prints 'VALIDATING'
it 'is a valid instance' do
  instance = Fabricate.build(:my_class)
  instance.other_required_prop = nil
  instance.should have(1).errors_on(:other_required_prop)
end

我假设在检查这些错误时应始终运行validate。但是,在测试#2中运行,从不在测试#1中运行,而且我完全不知道如何跳过它。它似乎与设置第二个属性有关,因为当第二个属性被注释掉时,测试#1运行validate

我知道我的例子很稀疏,但有没有人建议这样的事情会发生什么?

1 个答案:

答案 0 :(得分:0)

对不起伙计们,我发现自己在使用before_validation子句时已经开枪了:因为prevalidate中我最后一次评估的行返回false,它中止了验证。

def prevalidate
  self.required_prop = false if self.some_other_prop
  return true # Otherwise, it'll stop validation
end

有时返回上一次评估的Ruby方式会让我感到厌烦。