【问题标题】:Ruby valid? method红宝石有效吗?方法
【发布时间】:2016-09-15 00:44:01
【问题描述】:

我一直在用 RSpec 编写测试。

当我执行valid? 方法时,它会删除对象拥有的错误消息。 我不明白为什么会这样。 这是 RSpec 还是 Ruby 特定的行为? 如果是这种情况,我该如何解决?

我经常看到类似的测试用例,

it"isinvalidwithoutafirstname"do
  contact = Contact.new(firstname: nil)
  contact.valid?
  expect(contact.errors[:firstname]).not_to include("can't be blank")
end

为什么在这个例子中他们在expect之前使用contact.valid

更新

plan = Plan.new(
  xxx_id: xxx_id,
  amount: amount,
  currency: currency,
  interval: interval,
  name: name,
  description: description
)

return plan unless plan.valid?

begin
  XXX::Plan.create(
    id: xxx_id,
    amount: amount,
    currency: currency,
    interval: interval,
    name: name
  )
rescue XXX::XXXError => e
  plan.errors[:base] << e.message
  return plan
end

plan.save && plan

这是方法的一部分。 我是红宝石新手。我应该把save 放在return plan 之前吗?

【问题讨论】:

    标签: ruby-on-rails ruby rspec


    【解决方案1】:

    contact 不会出现错误,除非您尝试保存它。只是初始化一个实例不会给它一个错误。在您致电.save.create 联系之前,错误对象不会被填充。

    http://guides.rubyonrails.org/active_record_validations.html#valid-questionmark-and-invalid-questionmark

    【讨论】:

    • “直到你调用 .save 或 .create” - 嗯,实际上是验证过程填补了错误。可以直接调用它,使用.valid?
    【解决方案2】:

    在上一个示例中,您调用 Plan.create 而不将其分配给任何变量。但是当抛出异常时,您会将错误添加到包含有效模型对象的变量 plan

    【讨论】:

      【解决方案3】:

      您是否在调用“有效”之后设置了间隔的值?因为 plan.errors 告诉您缺少间隔,但是当您在此之前检查计划行时它就在那里。

      “有效吗?”清除所有错误然后运行验证,因此,当您运行“有效?”时,间隔不是空白并且验证通过,这是预期的行为,如果有任何错误,则会填充错误属性,但如果没有,错误将是空白

      您发布的规范非常好,您有一个处于无效状态的对象(名字为零)那么有效吗?在该字段上添加错误(最好也测试“expect(contact).to be_invalid”)

      【讨论】:

        猜你喜欢
        • 2016-02-15
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2011-12-29
        • 2011-02-28
        • 2013-03-19
        • 2010-09-08
        • 2023-04-07
        相关资源
        最近更新 更多