如何测试失败代码中的存根?

How to test stubs in failing code?

我有一段代码在失败前重试某个 API 调用 3 次。我也有这个 API.

的存根

我想在失败的情况下写两个测试:

这是第一个测试:

it 'fails' do
  expect { risky_call } to raise_error SomeError
end

然而,第二个测试有点棘手:

it 'calls the API three times' do
  risky_call
  expect(stub).to have_been_requested.times(3)
end

问题是 risky_call 引发了 SomeError,导致测试失败。我想到了这样做:

it 'calls the API three times' do
  risky_call rescue nil
  expect(stub).to have_been_requested.times(3)
end

但这看起来确实很老套。

是否有 better/safer/more 惯用的方式来编写此规范?

不确定您的存根是什么样子,但这似乎是不需要应用每个测试规则的单一期望的时代之一。

您的规范非常明确,它应该在引发错误之前尝试 3 次,因此像

这样的测试
it 'calls the API three times before raising an error' do
  expect { risky_call }.to raise_error(SomeError)
  expect(stub).to have_been_requested.times(3)
end

对我来说合乎逻辑。在没有上下文的情况下期望它 "call 3 times" 不会。如果它只调用 1 次或 2 次怎么办?这使您的测试描述具有误导性。新的描述解释说它会在出现错误之前重试 3 次,这是您实际的意思并且很容易理解。