【问题标题】:Random RSpec failures comparing Floats (Eq matcher)比较浮点数的随机 RSpec 失败(Eq 匹配器)
【发布时间】:2019-03-14 18:30:06
【问题描述】:

我什至不知道从哪里开始。抱歉,如果这是重复的,但我什至不知道要搜索什么或这个特定问题被称为什么。

我的 RSpec 套件中的测试会随机失败,但并非经常如此,我会收到如下错误:

expected: 0.69
     got: 0.69 (0.69e0)

(compared using ==)

RSpec 代码正在比较来自两个不同模型的两个浮点数,当规范完成时它们应该是相同的值。有没有办法在命令控制台中重现这个?我已经尝试了明显的东西(如下),但老实说我不知所措。如果我重新运行测试十几次,我将无法重现该问题。

0.69 == 0.69e0 => true
0.69 == 0.69 => true
6.9e-1 == 0.69 => true

【问题讨论】:

标签: ruby rspec matcher


【解决方案1】:

在测试浮点数时,我建议你使用 RSpec 的 be_within matcher

例子:

expect(my_float).to be_within(0.01).of(0.69)

您应该选择对您的用例有意义的解决方案。 (0.001、0.0001 等)

【讨论】:

    【解决方案2】:

    这是测试浮点数的一般问题。使用 RSpec 时,我总是将它们转换为字符串进行比较:

    expect(float.to_s).to eq '0.69'
    

    【讨论】:

    • 它的解决方案几乎太简单了。我还想知道我是否应该在我的测试中使用 BigDecimal - 至少要使用 Numeric 类型。 float.to_d 应该也可以吗?
    • 我的规格中有很多 BigDecimal,但也必须在 BigDecimal 结果上调用to_s
    猜你喜欢
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多