我有一个应用程序,当路由丢失时会在生产时引发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错误?
答案 0 :(得分:2)
问题是get /unknown_path'
实际上没有引发错误 - 它只收到404请求。
每当从路由块或过滤器引发异常时,都会调用错误处理程序。可以从
获取异常对象sinatra.error
Rack变量...
您的测试正在测试实际错误(这是raise_error
所做的),而Sinatra正在压缩错误 - 否则,每次有人404服务器都会崩溃!
查看Sinatra testing guide以获得更好的测试方向。基本思想是在测试中使用get ...
设置last_response
局部变量,然后可以对其进行相等性测试等。
last_response
有一个status
属性,所以(就像在另一个答案中提到的那样)你可以测试以确保last_response.status
等于404。
我对此并不是很清楚。在测试模式下,应用程序实际上会引发错误。
<强> 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