我有以下红宝石代码
class Gateway
...
def post
begin
...
raise ClientError if state == :open
rescue ClientError => e
Log.add("error")
raise
end
end
end
在RSpec上,如何在ClientError
被提出Log.add
时检查?
我尝试了不同的东西,但我总是得到错误。
由于
答案 0 :(得分:4)
您可以执行以下操作(初始化步骤可能需要略有不同,具体取决于您需要将state
设置为:open
):
describe 'Gateway#post' do
let(:gateway) { Gateway.new(state: :open) }
before { allow(Log).to receive(:add) }
it 'raises an excpetion' do
expect { gateway.post }.to raise_error(ClientError)
expect(Log).to have_received(:add).with('error')
end
end
答案 1 :(得分:3)
这样的事情应该有效:
describe '#post' do
context 'with state :open' do
let(:gateway) { Gateway.new(state: :open) }
it 'logs the error' do
expect(Log).to receive(:add).with('error')
gateway.post rescue nil
end
it 're-raises the error' do
expect { gateway.post }.to raise_error(ClientError)
end
end
end
在第一个示例中,rescue nil
确保您的规范没有因为引发的错误而失败(它会无声地挽救它)。第二个示例检查是否正在重新引发错误。