提升路线未发现错误

时间:2011-02-16 21:40:20

标签: ruby-on-rails-3 cucumber

我正在写一本关于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

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

现在我在test.rb中设置了一个将要显示此异常页面的设置,但是我宁愿Rails对异常进行一次强烈的提升,以便它在Cucumber中显示为失败的步骤,就像我很确定它过去一样,而不是过去一步。

有人知道自去年5月以来Rails没有做到这一点会发生什么变化吗?我非常有信心config/environments/test.rb中有一些设置,但对于我的生活,我无法弄明白。

1 个答案:

答案 0 :(得分:3)

在我调查Rails源代码之后,似乎在测试环境中缺少负责引发异常ActionDispatch::ShowExceptions的{​​{1}}中间件。通过运行ActionController::RoutingErrorrake middleware确认。

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

因此,您看到测试用例正在传递的原因是因为ActionDispatch::ShowExceptions正在返回“未找到”文本,状态为404。


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


更新:要清除上一个区块,您将在这里遇到死胡同。如果您将rack-mount设置为action_dispatch.show_exceptions,则不会加载该中间件,导致false呈现的404错误。如果您将rack-mount设置为action_dispatch.show_exceptions,那么该中间件将被加载,但它将挽救错误并为您呈现一个漂亮的“例外”页面。