我正在使用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_和某些范围之类的值,我不必在那里硬编码确切的数字?
答案 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