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

时间:2018-06-14 10:04:37

标签: ruby unit-testing rspec stub

我有一段代码在失败之前重试某次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

但它确实看起来非常h​​ackish。

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

1 个答案:

答案 0 :(得分:1)

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

您的规范非常明确,它应该在引发错误之前尝试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次,这是你的实际意义并且易于理解。