如何使用Rack :: Test测试404 Sinatra :: NotFound错误?

时间:2013-08-29 00:42:57

标签: ruby sinatra rake-test

我有一个应用程序,当路由丢失时会在生产时引发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错误?

2 个答案:

答案 0 :(得分:2)

问题是get /unknown_path'实际上没有引发错误 - 它只收到404请求。

来自Sinatra: README

  

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

获取异常对象

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

查看Sinatra testing guide以获得更好的测试方向。基本思想是在测试中使用get ...设置last_response局部变量,然后可以对其进行相等性测试等。

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

编辑:

我对此并不是很清楚。在测试模式下,应用程序实际上会引发错误。

来自Sinatra Settings

  

<强> raise_errors   提出异常(将停止申请)。默认情况下,当环境设置为“test”时启用,否则禁用。

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

答案 1 :(得分:1)

试试这个:

get '/unknown_path'
assert_equal last_response.status, 404