validate_presence_of应该是规范和默认值

时间:2015-08-06 00:38:08

标签: 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_presence_of(:plan) }

新代码更好,因为它并不总是必须在数据库中查找此对象的每个实例化的计划对象,但我很好奇测试对象中的测试和它的生命周期。

1 个答案:

答案 0 :(得分:1)

以下是发生的事情:

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

使用新代码,valid?将调用plan方法并填充它,以便在测试套件检查errors时,它不会找到任何计划。

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