【问题标题】:validate_presence_of shoulda spec and default valuesvalidate_presence_of shoulda 规范和默认值
【发布时间】:2015-08-06 00:38:08
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails-4 rspec-rails shoulda


    【解决方案1】:

    这是发生了什么:

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

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

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

    【讨论】:

    • 这是正确的。无需添加验证计划永远不会为零;这样的验证永远不会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    相关资源
    最近更新 更多