如何测试失败代码中的存根?
How to test stubs in failing code?
我有一段代码在失败前重试某个 API 调用 3 次。我也有这个 API.
的存根
我想在失败的情况下写两个测试:
- 整个事情失败了;
- API被调用了3次
这是第一个测试:
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 次,这是您实际的意思并且很容易理解。
我有一段代码在失败前重试某个 API 调用 3 次。我也有这个 API.
的存根我想在失败的情况下写两个测试:
- 整个事情失败了;
- API被调用了3次
这是第一个测试:
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 次,这是您实际的意思并且很容易理解。