gpt4 book ai didi

ruby - 比较 RSpec 中包含 BigDecimal 的哈希值

转载 作者:数据小太阳 更新时间:2023-10-29 07:16:50 24 4
gpt4 key购买 nike

我正在使用 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 是一个 float ,而哈希中包含的实际值是一个 BigDecimal。如果我将测试中的行更改为:

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

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

有没有一种方法可以使用类似 a_value_ 的方法将值与某个范围进行比较,我不必在其中硬编码一个确切的数字?

最佳答案

float 不精确(甚至到了 (0.1 + 0.2) == 0.3 返回 false 的程度),因此您必须使用允许值接近 到您的期望值而不是等于。 RSpec 的 be_within(x).of(y)(及其别名 a_value_within(x).of(y))专为匹配 float 而设计。 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))

关于ruby - 比较 RSpec 中包含 BigDecimal 的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com