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
相关产品推荐
相关产品推荐

