Ruby on rails 4 验证是否存在shoulda规范和默认值
我在Rails模型中有一些代码可以做到这一点:Ruby on rails 4 验证是否存在shoulda规范和默认值,ruby-on-rails-4,rspec-rails,shoulda,Ruby On Rails 4,Rspec Rails,Shoulda,我在Rails模型中有一些代码可以做到这一点: has_one :plan validates_presence_of :plan 过去是这样做的: after_initialize :set_plan def set_plan self.plan ||= FreePlan.new end 现在是: def plan super || (self.plan = FreePlan.new) end 但现在,该测试失败: it { is_expected.to validate_pr
has_one :plan
validates_presence_of :plan
过去是这样做的:
after_initialize :set_plan
def set_plan
self.plan ||= FreePlan.new
end
现在是:
def plan
super || (self.plan = FreePlan.new)
end
但现在,该测试失败:
it { is_expected.to validate_presence_of(:plan) }
新代码更好,因为它不必总是在DB中查找该对象的每个实例化的plan对象,但我很好奇测试在测试对象及其生命周期方面做了什么。下面是发生的情况: 对于较旧的代码,将调用_initialize后的
,并自动填充该值。但随后可以将plan
设置为nil,然后尝试保存它
使用新代码,valid?
将调用plan
方法,并因此填充它,这样当测试套件检查错误时,它将不会找到任何计划
也许最好的做法是从测试套件中删除该行并添加一行,以确保计划永远不会为零。这是正确的。不需要添加一个验证,即该计划永远不会为零;这样的验证永远不会失败。