我想知道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
我见过可以根据快照进行匹配的库,但是还没有找到任何可以导致预期答案内联的东西。
感谢您的帮助
答案 0 :(得分:0)
我认为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有用。
现实是,当您更改代码时,测试应该/通常会失败。令人讨厌的是您必须返回并修复测试,但同时也应确保测试提供了一定的价值。如果我更改了代码并且没有通过失败的测试,我会更加感到震惊。