rails模型单元测试试图击中数据库抛出零

时间:2014-05-26 22:45:06

标签: ruby-on-rails unit-testing ruby-on-rails-4 minitest

有关如何解决此测试错误的任何建议。数据库有我在测试期间尝试获取的记录并运行测试。我使用的是minitest 5.3.3,rails 4.1.1 app和ruby 2.0.0p247

抛出测试输出和错误:

 Finished in 0.017919s, 167.4200 runs/s, 55.8067    assertions/s.                                                                                                                                                                                                                                                                                                                                     
  1)       Error:                                                                                                                                                                                     
   Ff::BendRateTest#test_class_method:                                                                                                                                                        
   NoMethodError: undefined method `rate' for nil:NilClass 

这是由使用activerecord范围查询数据库的这一行引起的。所以我尝试获取记录nd然后从获取的记录中获取费率的值:

d = Ff::BendRate.by_counter(letter_b)

测试类:

 module Ff
   class BendRateTest < ActiveSupport::TestCase

     def test_class_method
       m = Ff::BendRate.convert('2014-05-06', 10, 'us', 'gb')
       assert_equal 5, m
     end  
    end
  end

模型如下所示:

 module Ff
  class BendRate < ActiveRecord::Base
    scope :by_counter, -> (letter) {where(letter: letter) } 

    def self.convert(date, amount, letter_a, letter_b)
     Bender.new(date, letter_a, letter_b).converter(amount)
    end  

  end
 end

我们在上面的模型中实例化的Bender类:

  class Bender

   def initialize(date = Date.today, letter_a, letter_b)
     @letter_a =  letter_a
     @letter_b = letter_b
     @date = date
   end

   def attempter
    baseup(@letter_a, @date)
    counterup(@letter_b, @date)
   end

   def converter(amount = 10)
    @rate = attempter
    (@rate * amount.to_f).round(4)
   end

   private

   def counterup(letter_b, date)
     d = Ff::BendRate.by_counter(letter_b) 
     e = d.first
     @counteracting = e.rate.to_f
     @counter_up_rate = (@counteracting / @baserater).round(4)
   end

   def baseup (leter_a, date)
    a = Ff::BendRate.by_counter(letter_a) 
    b = a.first
    @baserater = b.rate.to_f
    @base_to_base = ( @baserater / @baserater).round(4)
   end
 end

1 个答案:

答案 0 :(得分:1)

您的测试没有显示,为什么它应该返回5项,您没有任何手动插入或通过灯具插入的代码。您应该在测试中明确显示您添加了所有需要的记录,然后检查您的方法是否与该数据一起正常工作。

在其他地方,我用来查找问题的步骤:

  1. BendRate#converter编写测试 - 它应该以相同的错误失败
  2. Bender#attempter编写测试 - 它也会因同样的错误而失败
  3. 为两个案例BendRate.by_counterletter_a编写范围letter_b的测试 - 由于您没有setup数据
  4. ,它会失败

    或骗子:

     def test_class_method
       p Ff::BendRate.all
       m = Ff::BendRate.convert('2014-05-06', 10, 'us', 'gb')
       assert_equal 5, m
     end