【问题标题】:How to test Mongo connection error handling with RSpec如何使用 RSpec 测试 Mongo 连接错误处理
【发布时间】:2016-08-07 16:39:53
【问题描述】:

我需要解决我的应用程序的测试。 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,我可以让它落在异常上,但这不是我的想法。

感谢您的宝贵时间。

【问题讨论】:

  • @DaveSchweisguth 到目前为止运气不佳。我知道我必须用 expect(response).to raise_exception 来测试它听起来不错,但我还没有找到使动作落在救援错误上的方法。救援 Mongo::Error::NoServerAvailable => _e

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


【解决方案1】:

要到达处理异常的代码行,存根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。我使用了长版本,因为它更容易理解发生了什么。

【讨论】:

  • 非常感谢兄弟。我花了一点时间让它工作。但它有所帮助。
  • 随时为未来的嘲笑者添加一些细节,我们中的任何一个都可以更新我们的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2020-01-31
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多