比较RSpec中包含BigDecimal的哈希值

时间:2015-06-29 22:38:46

标签: ruby hash rspec

我正在使用RSpec(3.x)来测试与计算器类似的对象。该对象将结果放入哈希值。但我无法在测试中正确匹配哈希值。以下是我所谈论的一个例子:

class ObjectUnderTest

  def calculate(a, b)
    value = a.to_d / b
    {
      value: value
    {
  end

end

测试如下:

RSpec.describe ObjectUnderTest do

   it "calculates the product of two values" do
     o = ObjectUnderTest.new
     expect(o.calculate(1, 3)).to eql({value: 0.333})
   end
end

问题是0.333是一个浮点数,哈希中包含的实际值是一个BigDecimal。如果我将测试中的行更改为:

expect(o.calculate(1, 3)).to eql({value: 0.333.to_d(3)})

...测试仍然失败A)因为精度不同,而B)在我的实际代码中,我有几个键值对,我不想调用k.to_d(some_precision )在所有比较哈希上让它通过。

有没有办法比较a_value_和某些范围之类的值,我不必在那里硬编码确切的数字?

2 个答案:

答案 0 :(得分:4)

浮点数是不精确的(甚至到(0.1 + 0.2) == 0.3返回false的点),因此您必须使用匹配 near 的匹配器,而不是等于。 RSpec的be_within(x).of(y)(及其别名a_value_within(x).of(y))用于匹配浮点数。 RSpec 3还通过将匹配器替换为值来支持可组合匹配器和match匹配器allows you to match nested hash/array data structures,因此您可以执行此操作:

expect(o.calculate(1, 3)).to match(value: a_value_within(0.001).of(0.333))

答案 1 :(得分:0)

您可以尝试使用eql代替for idx in range(0, 100): if os.path.exists(str(idx) + ".out.txt"): continue else: output_file = open(str(idx) + ".out.txt", "w")

结帐rspec各种equality matchers