assert_equal表示&lt; 0.15&gt;预期但是<0.15>,但仅当该方法以某种方式计算0.15时

时间:2010-08-16 07:43:44

标签: ruby-on-rails unit-testing testing assert

因此对于这种模型方法:

def tax_rate
  tax_rate = 0.0
  tax_rate += STATE_TAX if state_taxable?  #STATE_TAX = 0.1
  tax_rate += IMPORT_TAX if imported?      #IMPORT_TAX = 0.05
  tax_rate
end

此测试失败:

@item.update_attributes({:state_taxable => true,
                         :imported => true,
                         :price => 32.19})
assert_equal 0.15, @item.tax_rate

我收到此错误:

<0.15> expected but was <0.15>.

但是,此测试将通过:

@item.update_attributes({:state_taxable => true,
                         :imported => false,
                         :price => 14.99})
assert_equal 0.1, @item.tax_rate

因此,当tax_rate为0.0 + 0.1 + 0.05时,我会收到错误,但在0.0 + 0.1或0.0 + 0.05时则不会。 0.15都是Floats,所以我看不出是什么造成了这种情况。我花了太长时间考虑这个,希望有人可以指出罪魁祸首是什么。先谢谢你们。

4 个答案:

答案 0 :(得分:9)

浮点数无法准确表示;您需要做的是使用assert_in_delta检查您是否在指定范围内。

assert_in_delta 0.15, @item.tax_rate, 0.001之类的东西应该这样做:它会检查你是否在预期值的0.001之内。

答案 1 :(得分:3)

恕我直言,你应该存储整数(以美分为单位)。

答案 2 :(得分:1)

我多次出现此错误,原因是他们不同的类

尝试

assert_equal 0.15.class, @item.tax_rate.class

我相信它会说像

<float> expected but was <double>.

如果你这样做

assert_equal 0.15.to_float, @item.tax_rate.to_float

它可能会通过

答案 3 :(得分:0)

0.1以及浮点算术中的其他数字cannot be represented exactly。因此,你应该使用类似的东西(我不是Ruby人):

assert_true abs(0.15 - @item.tax_rate) < 0.0001

一般来说,你不应该真的使用花车来换取金钱/货币:有很多非常令人讨厌的微妙问题会在裂缝之间赔钱。请参阅this question