Ruby on rails Ruby有效吗?方法

Ruby on rails Ruby有效吗?方法,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我一直在用RSpec写测试 当我执行valid?方法时,它会删除对象拥有的错误消息。 我不明白为什么会这样。 这是RSpec还是Ruby特有的行为? 如果是这样的话,我该如何回避呢 我经常看到这样的测试用例 it"isinvalidwithoutafirstname"do contact = Contact.new(firstname: nil) contact.valid? expect(contact.errors[:firstname]).not_to include("ca

我一直在用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\u id:xxx\u id,
金额:金额,,
货币:货币,,
间隔:间隔,,
姓名:姓名,,
描述:描述
)
退货计划,除非计划有效?
开始
XXX::Plan.create(
id:xxx\U id,
金额:金额,,
货币:货币,,
间隔:间隔,,
姓名:姓名
)
营救XXX::XXXError=>e

计划错误[:base]
联系人
不会有错误,除非您尝试保存它。只是初始化一个实例不会给它一个错误。只有在联系时调用
.save
.create
时,才会填充错误对象


请参见上一个调用
计划的示例中的。创建
而不将其分配给任何变量。但当异常抛出时,您会将错误添加到包含有效模型对象的变量
plan

调用“valid”后是否设置了间隔值?因为plan.errors告诉您缺少间隔,但在检查之前的plan行时,间隔就存在了

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


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

“直到调用.save或.create”-嗯,实际上是验证过程填充了错误。您可以使用
.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