如何使用RSpec测试Mongo连接错误处理

时间:2016-08-07 16:39:53

标签: ruby-on-rails ruby mongodb rspec rspec-rails

我需要解决我的应用测试。 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,我可以让它落在例外上,但这不是主意。

感谢您的时间。

1 个答案:

答案 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。我使用了长版本,因为它更容易理解发生了什么。