Ruby有效吗?方法

时间:2016-09-15 00:44:02

标签: ruby-on-rails ruby rspec

我一直在用RSpec写测试。

当我执行valid?方法时,它会删除对象拥有的错误消息。 我无法理解为什么会这样。 这是RSpec或Ruby特有的行为吗? 如果是这样的话,我应该如何解决它呢?

enter image description here

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

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

为什么在此示例中他们在contact.valid之前使用expect

更新

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

这是该方法的一部分。 我是红宝石的新手。我应该以{{1​​}}以红宝石的方式放置save吗?

3 个答案:

答案 0 :(得分:0)

除非您尝试保存,否则

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否在调用“有效?”后设置了间隔值?因为plan.errors告诉你间隔时间丢失了,但是在你检查之前它就在那里。

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

你发布的规范是完全正常的,你有一个无效状态的对象(名字是零)这么有效吗?在该字段上添加错误(也可以测试“expect(contact).to be_invalid”)