【问题标题】:How to test 404 Sinatra::NotFound errors with Rack::Test?如何使用 Rack::Test 测试 404 Sinatra::NotFound 错误?
【发布时间】:2013-09-01 06:35:56
【问题描述】:

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

【问题讨论】:

    标签: ruby sinatra rake-test


    【解决方案1】:

    试试这个:

    get '/unknown_path'
    assert_equal last_response.status, 404
    

    【讨论】:

      【解决方案2】:

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

      来自Sinatra: README

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

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

      查看Sinatra testing guide 以获得有关形成测试的更好指导。基本思想是在测试中使用get ... 设置last_response 局部变量,然后可以测试其是否相等等。

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

      编辑:

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

      来自Sinatra Settings

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

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

      【讨论】:

      • 我不太明白...你是什么意思生产异常?
      • 我做了一些更改,希望能解决这个问题。您要确保引发正确的 type 错误,否则默认情况下只会引发 Exception。 (嗯,反正我是这么认为的)
      • 我的意思是我们正在使用 Honeybadger,它得到了 route not found 错误。它只应该捕获异常。所以神秘的是,在测试中它不会引发错误,但在生产中它确实会引发错误并将它们发送给 Honeybadger。
      • 好的,那么当您将raise 'error' 替换为404(引发404 NotFound 错误的快捷方式)并更改测试以查找最后一个响应的状态时会发生什么,而不是而不仅仅是看看是否抛出了错误?
      • @BSeven 你有没有想过如何不向 Honeybadger 发送 404 错误?
      猜你喜欢
      • 2012-02-19
      • 2015-12-12
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      相关资源
      最近更新 更多