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



我有一段代码在失败之前重试某个 API 调用 3 次。我还有一个用于此 API 的存根。

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

  • 整个事情失败了;
  • 该 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

但它看起来确实很黑客。

有没有更好/更安全/更惯用的方式来编写此规范?

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

您的规范非常清楚,在引发错误之前应该尝试 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

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

最新更新