我正在写一本关于Rails 3的书,过去我在第3章左右写过,当运行特定功能时会产生路由错误。现在,与我不同的是,写下不真实的东西,所以我很确定这在过去发生过一次。
我自己还没有能够复制这个场景,但我非常有信心这是环境文件中被遗忘的设置之一。
要复制此问题:
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
中有一些设置,但对于我的生活,我无法弄明白。
答案 0 :(得分:3)
在我调查Rails源代码之后,似乎在测试环境中缺少负责引发异常ActionDispatch::ShowExceptions
的{{1}}中间件。通过运行ActionController::RoutingError
和rake 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
,那么该中间件将被加载,但它将挽救错误并为您呈现一个漂亮的“例外”页面。