0

我有一个应用程序在缺少路线时会在生产中引发 404 Sinatra::NotFound 错误。

但是,以下测试通过:

it 'should not raise error' do
  expect{ get '/unknown_path' }.to_not raise_error
end

为什么在测试中不会出现 404 Sinatra::NotFound 错误?

以下确实会引发错误并导致测试失败:

get '/unknown_path' do
  raise 'error'
end

如何测试 404 Sinatra::NotFound 错误?

4

2 回答 2

2

问题是这get /unknown_path'实际上并没有引发错误——它只是接收到一个 404 请求。

来自Sinatra:自述文件

每当从路由块或过滤器引发异常时,都会调用错误处理程序。异常对象可以从sinatra.errorRack 变量中获取...

您的测试是在测试一个实际的错误(这是做什么raise_error的),而 Sinatra 正在压缩错误——否则,每次有人 404 时服务器都会崩溃!

查看Sinatra 测试指南以更好地指导您的测试。基本思想是get ...在测试中使用设置last_response局部变量,然后可以测试其是否相等等。

last_response有一个status属性,所以(就像在另一个答案中提到的那样)你可以测试以确保它last_response.status等于 404。

编辑:

我不是很清楚这一点。在测试模式下,应用程序确实会引发错误。

Sinatra 设置

raise_errors 引发异常(将停止应用程序)。当环境设置为“测试”时默认启用,否则禁用。

因此,您实际上不想引发任何错误,而是raise Sinatra::NotFound.new("Not found!")要引发特定类型的错误。该Sinatra::NotFound错误将触发 404 处理程序。Sinatra 错误处理

于 2013-08-29T19:31:07.570 回答
1

尝试这个:

get '/unknown_path'
assert_equal last_response.status, 404
于 2013-08-29T02:07:24.060 回答