我需要解决我的应用测试。 Coverage抱怨一行代码评估与MongoDB(rescue Mongo::Error::NoServerAvailable => _e
)的连接并呈现错误。
您认为我应该用什么来测试这个:
def index
render json: Complex.all.to_json
rescue Mongo::Error::NoServerAvailable => _e
render json: { error_description: 'no database available' }, status: 503
end
我正在尝试用类似的东西进行测试:
it 'should return an exception' do
get :index
expect(response).to raise_exception
end
我发现我应该使用
.and_raise(IOError)
但我不知道在哪里使用它来使它落在线上。 实际上,如果我停止Mongo,我可以让它落在例外上,但这不是主意。
感谢您的时间。
答案 0 :(得分:1)
要访问处理异常的代码行,请使用stub Complex.all.to_json
来引发异常。由于Complex.all.json
是链接的,因此需要额外的努力才能将其存根。此外,由于处理了异常,您无法测试它是否被提出;相反,测试处理它的结果。
it 'should handle the exception' do
all = double
allow(all).to receive(:to_json).and_raise Mongo::Error::NoServerAvailable
allow(Complex).to receive(:all).and_return all
get :index
expect(response.status).to eq(503)
expect(response.body).to include('no database available')
# you could test the JSON more thoroughly, but you get the idea
end
您可以使用receive_message_chain
来使用更少的代码来存根Complex.all.to_json
。我使用了长版本,因为它更容易理解发生了什么。