You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中使用Rspec检查Payment模型属性报undefined method错误如何解决

问题根因

你代码的核心错误是对Rails中ActiveRecord模型的save方法返回值认知错误:

  • save方法执行后只会返回布尔值true(保存成功)或false(保存失败),不会返回模型实例本身
  • 你链式调用Payment.new(...).save(validate: false)时,最终赋值给@payment的是保存成功返回的true,后续调用@payment.card_number相当于给布尔值调用不存在的方法,自然抛出对应报错
修正方案

拆分实例化和保存的操作,先把模型实例赋值给变量,再执行保存操作,修正后的测试代码如下:

RSpec.describe Payment, type: :model do
  context 'after saving' do
    it 'card number is truncated' do
      # 先实例化模型赋值给变量
      @payment = Payment.new(
        :card_number => "5520000000000000",
        :card_name => "Tom Jones",
        :card_security_code => "123",
        :card_expiry => "10/30",
        :email => "test@mail.com",
        :address_line1 => "400 Test Lane",
        :state => "WA",
        :postcode => "6000",
        :country => "Australia",
        :status => "processing"
      )
      # 单独执行保存操作
      @payment.save(validate: false)
      # 若卡号截断逻辑是数据库层的字段长度限制,需要加这行重新加载数据库存储的实际值
      # @payment.reload
      # 再对实例属性做断言
      expect(@payment.card_number).to eq('0000')
    end
  end
end
额外优化提示
  • 可以增加保存结果的断言,避免保存失败导致后续断言无意义:expect(@payment.save(validate: false)).to be(true)
  • 如果卡号截断逻辑写在数据库字段长度限制中,内存里的实例属性不会自动更新,必须调用@payment.reload加载数据库实际存储值后再做断言

内容的提问来源于stack exchange,提问作者themartin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:39:00