【问题标题】:Can't Get Model to Pass Rspec with ActiveRecord Relation无法通过 ActiveRecord 关系让模型通过 Rspec
【发布时间】:2016-04-03 18:30:21
【问题描述】:

型号:payment.rb

class Payment < ActiveRecord::Base
  belongs_to :loan

  def self.previous_payments(id)
    where(loan_id: id)
  end

end

我要做的只是测试以确保找到付款是否具有正确的loan_id

测试:

describe '#self.previous_payments' do
  let(:loan) {Loan.create!(id: 1, funded_amount: 1000.0)}
  let(:payment_one) {Payment.create!(amount: 100.0, loan_id: 1)}
  let(:payment_test) {Payment.previous_payments(1)}

  it 'retrieves all the payments made for a specific loan' do
    expect(payment_test.first.loan_id).to eql(1)
  end
end

但我不断收到此错误:

expected: 1
got: #<ActiveRecord::Relation []>

而且看起来 [] 表示甚至没有找到任何记录?

任何帮助都将不胜感激!

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    Rspec 的 let 语法是惰性的,这意味着 loanpayment_one 在您的测试中明确调用它们之前不会存在。因为payment_test 没有对loanpayment_one 进行任何显式调用,所以它返回一个空关系。如果你使用let!,你的变量不会被延迟加载:

    let!(:loan) {Loan.create!(id: 1, funded_amount: 1000.0)}
    let!(:payment_one) {Payment.create!(amount: 100.0, loan_id: 1)}
    

    你也可以做类似的事情

    loan.reload
    payment_one.reload
    expect(payment_test.first.loan_id).to eql(1)
    

    在测试中强制加载loanpayment_one

    【讨论】:

    • 啊,非常感谢 james00794!工作完美。永远不会猜到会用“let!”代替“let”。
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多