2015-11-02 38 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