在 RSpec 中测试更新操作,结果为真,但测试失败?

Posted

技术标签:

【中文标题】在 RSpec 中测试更新操作,结果为真,但测试失败?【英文标题】:Testing an update operation in RSpec, evaluates to true, but test fails? 【发布时间】:2022-01-06 16:55:14 【问题描述】:

我有这个测试:

it "saves the notification id in the referral for future reference" do
  expect  subject.perform(*args) 
    .to change(referral, :notification_id).from(nil).to(customer_notification_delivery.id)
end

它在上面运行的代码是:

if notification.present?
  referral.update(friend_customer_notification_delivery_id: notification.id)
end

我添加了一些调试消息,以在触发测试后检查它们,以确保满足此条件,并且代码正在运行,我得到了 true 两者

  p notification.present?
  p referral.update(friend_customer_notification_delivery_id: customer_notification_delivery.id)

我缺少什么吗?为什么更新返回 true,但值在测试中没有得到更新?

我得到的输出: expected #notification_id to have changed from nil to 5, but did not change

【问题讨论】:

【参考方案1】:

您的测试中的referral 和您的被测对象中的referral 是两个不同的对象,我敢打赌。对其中一个的更改不会影响另一个。测试中的referral 不会神奇地从其他代码生成的相关数据库记录中提取更新。

我一般都是这样的

it "saves the notification id in the referral for future reference" do
  expect  subject.perform(*args) 
    .to change referral.reload.notification_id .from(nil).to(customer_notification_delivery.id)
end

【讨论】:

感谢@Sergio Tulentsev,我尝试仅使用 (referral.reload) 重新加载模型不起作用,使用您的方法(还添加属性)我得到了 TypeError: nil is not a symbol nor a string @queroga_vqz: 试试我的方法 没关系,我想念你也用括号把它改成了一个块。我的错,谢谢!

以上是关于在 RSpec 中测试更新操作,结果为真,但测试失败?的主要内容,如果未能解决你的问题,请参考以下文章

shell 常用文件字符串二元整数测试操作符-持续更新中

为什么rspec运行不同数量的测试?

由于符号而不是 Rails 导致哈希失败的 RSpec 测试

Rspec 不显示邮件正文中的内容

RSpec 测试失败 - 使用显示套接字但缺少锁定文件

Rails PayPal IPN activemerchant 控制器 rspec 测试