validate_presence_of 应该有规范和默认值

validate_presence_of shoulda spec and default values

我在 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) }

新代码更好,因为它不必总是为这个对象的每个实例在数据库中查找计划对象,但我很好奇测试在下面的对象方面做了什么测试及其生命周期。

这是正在发生的事情:

使用旧代码,调用 after_initialize,并自动填充该值。但是可以随后将 plan 设置为 nil 然后尝试保存它。

使用新代码,valid? 将调用 plan 方法并填充它,这样当测试套件检查 errors 时,它不会发现任何计划。

也许最好的做法是从测试套件中删除该行并添加一个确保计划永远不会为零的行。