【问题标题】:Rsepc Validation Testing with custom validations: undefined method and nil class error带有自定义验证的 Rspec 验证测试:未定义的方法和 nil 类错误
【发布时间】:2023-03-19 08:34:02
【问题描述】:

我有一个简单的模型,付款属于贷款。我正在使用 rspec 和 shoulda-matcher 来测试验证。但是,我一直收到指向未结余额的错误——表明它是 nil 类的未定义方法。但是当我在 rails 控制台中使用模型时,这个验证是有效的。有谁知道为什么它没有通过测试???

谢谢。

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

【问题讨论】:

    标签: ruby-on-rails validation rspec shoulda


    【解决方案1】:

    应该匹配器使用您尚未设置的主题。据我了解,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。

    【讨论】:

    • 谢谢!我按照你说的做了,也有同样的错误……有什么想法吗?
    • 您的 factory_girl 负载和付款定义是什么?也许在 let!subject! 上添加解释标记,这样 RSpec 就不会懒惰地创建它们
    • 您好,感谢您的回复。我已经添加了我的工厂女孩​​代码。工厂在其他测试中运行良好。我试图检查工厂女孩实例变量,输出看起来也很好。添加解释标记是什么意思?
    • 对不起,我的意思是感叹号。
    • 您好,我发现了问题所在。在proper_amount方法中添加return unless amount && loan_id。但 !在其他地方也帮助过我。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多