使用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
。
我知道我的例子很稀疏,但有没有人建议这样的事情会发生什么?
答案 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方式会让我感到厌烦。