RSpec中测试update操作返回true但测试用例失败是什么原因?
问题原因
- 核心原因是测试断言的字段和业务代码更新的字段不匹配
业务代码中调用referral.update更新的是friend_customer_notification_delivery_id字段,但RSpec测试里change方法监听的是notification_id字段,二者是完全不同的属性,自然无法检测到更新。你在调试中看到update返回true,仅代表friend_customer_notification_delivery_id字段更新成功,和测试监听的字段无关。 - 次要常见坑是测试用的
referral实例未重载
即使修正了字段名,如果业务代码中操作的referral是通过ID重新查询得到的新ActiveRecord实例,测试中预先创建的referral实例的内存属性不会自动同步数据库的更新,也会导致检测不到变化。
解决方案
- 先对齐字段逻辑:
- 如果你确实需要监听
notification_id字段,要么修改业务代码更新notification_id,要么在Referral模型中添加别名映射:alias_attribute :notification_id, :friend_customer_notification_delivery_id - 如果你实际要校验的是
friend_customer_notification_delivery_id,直接修改测试断言的字段即可。
- 如果你确实需要监听
- 给测试断言添加重载逻辑,避免实例缓存问题:
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
内容的提问来源于stack exchange,提问作者queroga_vqz
相关产品推荐
相关产品推荐

