我在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_presence_of(:plan) }
新代码更好,因为它并不总是必须在数据库中查找此对象的每个实例化的计划对象,但我很好奇测试对象中的测试和它的生命周期。
答案 0 :(得分:1)
以下是发生的事情:
使用旧代码调用after_initialize
,并自动填充该值。但是随后可以将plan
设置为nil,然后尝试保存它。
使用新代码,valid?
将调用plan
方法并填充它,以便在测试套件检查errors
时,它不会找到任何计划。
也许最好的做法是从测试套件中删除该行并添加一行,确保该计划永远不会为零。