有关如何解决此测试错误的任何建议。数据库有我在测试期间尝试获取的记录并运行测试。我使用的是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
答案 0 :(得分:1)
您的测试没有显示,为什么它应该返回5
项,您没有任何手动插入或通过灯具插入的代码。您应该在测试中明确显示您添加了所有需要的记录,然后检查您的方法是否与该数据一起正常工作。
在其他地方,我用来查找问题的步骤:
BendRate#converter
编写测试 - 它应该以相同的错误失败Bender#attempter
编写测试 - 它也会因同样的错误而失败BendRate.by_counter
和letter_a
编写范围letter_b
的测试 - 由于您没有setup
数据或骗子:
def test_class_method
p Ff::BendRate.all
m = Ff::BendRate.convert('2014-05-06', 10, 'us', 'gb')
assert_equal 5, m
end