有没有一种方法可以自动更新RSpec期望值?

时间:2019-02-06 22:45:47

标签: ruby rspec rspec3

我想知道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

我见过可以根据快照进行匹配的库,但是还没有找到任何可以导致预期答案内联的东西。

感谢您的帮助

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有用。

现实是,当您更改代码时,测试应该/通常会失败。令人讨厌的是您必须返回并修复测试,但同时也应确保测试提供了一定的价值。如果我更改了代码并且没有通过失败的测试,我会更加感到震惊。