2016-04-03 7 views
0

モデル:payment.rbはActiveRecordの関係でRSpecのを渡すためにモデルを取得することはできません

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 []> 

[]は、レコードが見つからないということですか?

ご協力いただければ幸いです。

答えて

1

Rspecのlet構文は遅延です。つまり、loanpayment_oneはテストで明示的に呼び出されるまで存在しません。 payment_testloanまたはpayment_oneへの明示的な呼び出しを行わないため、空の関係を返します。あなたがlet!を使用している場合は、あなたの変数は遅延ロードされません。

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

また、ロードするloanpayment_oneを強制するために、テスト内

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

ような何かを行うことができます。

+0

Ahhh thanks a ton james00794!完璧に働いた。 "let"の代わりに "let!"を置くことについて決して想像していないでしょう。 – user3007294

関連する問題