提升路由未找到错误

Rya*_*igg 5 cucumber ruby-on-rails-3

我现在正在写一本关于 Rails 3 的书,过去的我已经在第 3 章左右写过,所以当运行特定功能时会生成路由错误。现在,我不像我去写不真实的东西,所以我很确定这在过去发生过一次。

我还没有能够自己复制这个场景,但我非常有信心它是环境文件中被遗忘的设置之一。

要复制此问题:

  • 生成一个新的 Rails 项目
  • 重要:删除public/index.html文件
  • 将黄瓜导轨和水豚添加到您的“测试”组中 Gemfile
  • bundle install
  • rails g cucumber:skeleton
  • 生成一个新功能,调用它 features/creating_projects.feature
  • 在这个功能里面放:

这个:

Feature: Creating projects
  In order to value
  As a role
  I want feature

Scenario: title
  Given I am on the homepage
Run Code Online (Sandbox Code Playgroud)

当您使用bundle exec cucumber features/creating_projects.feature它运行此功能时,它应该会失败并显示“No route matching /”错误,因为您没有定义根路由。但是,我和其他人所看到的是它没有

现在我已经设置了一个设置test.rb来显示这个异常页面,但我宁愿 Rails 对异常进行硬引发,以便它在 Cucumber 中显示为一个失败的步骤,就像我很确定它使用了到,而不是一个通过的步骤。

有谁知道自去年 5 月以来 Rails 不这样做会发生什么变化?我非常有信心这是在 中的一些设置config/environments/test.rb,但对于我的生活我无法弄清楚。

sik*_*chu 4

在我研究了 Rails 源代码后,测试环境中似乎缺少ActionDispatch::ShowExceptions负责引发异常的中间件。ActionController::RoutingError通过运行rake middleware和来确认rake middleware RAILS_ENV=test

您可以在https://github.com/josh/rack-mount/blob/master/lib/rack/mount/route_set.rb#L152中看到它返回X-Cascade => 'pass'标头,并且有ActionDispatch::ShowExceptions责任拾取它(在https ://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/show_exceptions.rb#L52

因此,您看到测试用例通过的原因是rack-mount返回“Not Found”文本,状态为 404。


我会责怪人们并为你解决问题。这是这里的条件: https: //github.com/rails/rails/blob/master/railties/lib/rails/application.rb#L159。如果设置为 true,则错误会被正确转换,但我们会得到错误页面输出。如果为 false,则根本不会加载该中间件。坚持,稍等 ...


更新:要清除前一个块,您就进入了死胡同。如果您设置action_dispatch.show_exceptionsfalse,则不会加载该中间件,从而导致rack-mount渲染时出现 404 错误。然而,如果您设置action_dispatch.show_exceptionstrue,该中间件将被加载,但它将挽救错误并为您呈现一个漂亮的“异常”页面。