2015-11-02 58 views
0

我有一個簡單的模型,其中付款屬於貸款。我正在使用rspec和shoulda-matcher來測試驗證。然而,我仍然收到錯誤指出未完成的餘額 - 表明這是一個未定義的方法爲零類。但是當我在rails控制檯中使用模型時,此驗證正在工作。任何人都知道爲什麼它沒有通過測試?Rsepc驗證測試與自定義驗證:未定義的方法和零類錯誤

謝謝。

class Payment < ActiveRecord::Base 
    belongs_to :loan 

    validates_presence_of :loan_id 
    validate :proper_amount 

    private 

    def proper_amount 
    errors.add(:amount, "proper") if amount > loan.outstanding_balance 
    end 
end 

FactoryGirl.define do 
    factory :payment do 
    loan 
    amount 100.0 
    post_at Date.today 
    end 
end 

FactoryGirl.define do 
    factory :loan do 
    funded_amount 5000.0 
    end 
end 

RSpec.describe Payment do 

    before (:all) do 
    @loan = FactoryGirl.create(:loan) 
    @payment = FactoryGirl.create(:payment, loan: @loan) 
    end 

    describe 'ActiveModel validations' do 

    #basic validations on attributes 
    it { should validate_presence_of(:loan_id) } 
    end 
end 

Failure/Error: it { should validate_presence_of(:amount) } 
NoMethodError: 
    undefined method `outstanding_balance' for nil:NilClass 

回答

0

Shoulda匹配器使用您未設置的主題。因此,據我所知,RSpec將初始化一個。

RSpec.describe Payment do 

    let!(:loan){ FactoryGirl.create(:loan) } 
    subject!(:payment){ FactoryGirl.create(:payment, loan: loan) } 

    describe 'ActiveModel validations' do 

    #basic validations on attributes 
    it { should validate_presence_of(:loan_id) } 
    end 
end 

現在,而不是使用@loan和@payment,您需要在其他測試中使用貸款和付款。

+0

謝謝!我做了你所說的並有同樣的錯誤......有什麼想法? – LOCKLOCK

+0

你的factory_girl裝載和付款定義是什麼?也許給'let!'和'subject!'添加解釋標記,這樣RSpec不會創建它們懶惰地 –

+0

嗨,謝謝你的迴應。我在我的工廠女孩​​代碼中添加了。工廠在其他測試中工作正常。我試圖檢查工廠女孩實例變量,輸出也很好。你是什​​麼意思添加解釋標記? – LOCKLOCK