【问题标题】:Is there a way to automatically update an RSpec expectation?有没有办法自动更新 RSpec 期望?
【发布时间】:2019-07-01 00:03:30
【问题描述】:

我想知道 RSpec 中是否存在此功能。我在调查时似乎找不到任何结果。

我想做的是可以在 Jest 测试中完成的事情,如下所示:

// This is a Jest expectation

expect(foo).toMatchInlineSnapshot()

// On the first execution of this code, the value of foo will fill in the expectation and result in something like this

expect(foo).toMatchInlineSnapshot('bar')

我希望能够通过 RSpec 测试来做到这一点。

# Here's an RSpec expectation

expect(foo).to eq({ bar: 25 })

假设我对我的代码进行了更改,这将导致 foo[:bar] 具有不同的值,但我不知道该值是什么。

目前,我需要重新运行我的测试并看到一个错误,说明类似于

 Failure/Error: expect(foo).to eq({ bar: 25 })

       expected: { bar: 25 }
            got: { bar: 100 }

之后,我需要手动更新我的期望以使其通过。

有没有办法告诉 RSpec 自动更新期望值?

例如:

expect(foo).to eq({ bar: 25 }, {update: true})

将在运行测试后更改代码以匹配正确的值并导致以下代码替换上述预期:

expect(foo).to eq({ bar: 100 })

有没有现成的方法可以做到这一点?也许我可以使用 RSpec 运行一些命令?

spec UPDATE_EXPECTS=1

我已经看到可以根据快照进行匹配的库,但无法找到任何导致预期答案内联显示的内容。

感谢您的帮助

【问题讨论】:

  • 没听说过这样的事。
  • “但我不知道那个值会是什么”——这确实是个问题。您真的知道您的代码中发生了什么吗?你怎么不知道它会产生什么?
  • 值可能会从 25 变为 26,或者在将 Math.floor 更改为 Math.round 后保持 25。一次又一次地重新运行我的测试以更改 1 个值是非常乏味的。
  • 我不知道这个功能。而且我不认为这是我希望在框架中拥有的。在第一次编写规范时一次性执行此操作可能很有用,但仅作为手动复制+粘贴精心挑选的(很少?)失败消息到预期中的快捷方式。拥有像spec UPDATE_EXPECTS=1 这样的命令对我来说听起来很疯狂!
  • 深入挖掘,tool you are describing 专为 UI 测试 而设计。在这样的测试中,定义实际期望是完全不切实际的;快照测试只有在 something 发生变化时才会失败(但您可能不知道/不在乎什么)。我们在这里谈论的是 unit 测试,这是一种完全不同的测试类别。总之,这是一个非常糟糕的主意。

标签: ruby rspec rspec3


【解决方案1】:

我认为 RSpec 不存在这种类型的工具。最接近的可能是在脚本顶部使用 let 或实例变量。

let(:subtotal) { 25.0 } # can _maybe_ only update this if logic changed
let(:cart) { Cart.new }

before do
  cart.add_item(10.0)
  cart.add_item(15.0)
end

it do
  expect(cart.subtotal).to eq(subtotal)
end

当逻辑更改会破坏测试断言时,您仍然需要手动管理这些值。 RSpec 中已经有许多匹配器可以让您进行更松散的断言,例如be_within,但没有任何东西可以自动为您填充值。 include 匹配器是另一个强大的匹配器,可让您进行更松散的断言。

我觉得自动更新值相当于测试expect(x).to eq(x)。我不确定这种测试对于我通常看到的 RSpec 的用途有多大价值。

现实情况是,当您更改代码时,您的测试应该/经常会失败。您必须返回并修复测试很烦人,但它也应该让人放心,测试提供了一些价值。如果我更改了代码并且没有失败的测试,我会更加惊慌......

【讨论】:

    猜你喜欢
    • 2020-12-11
    • 2013-06-06
    • 2012-10-16
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多