为什么 rspec-rails 跳过中间件?

awe*_*ndt 3 rack rack-middleware rspec-rails ruby-on-rails-3

我有一个 Rails 应用程序 (3.2.12),我想通过 HTTP Accept-Language 标头添加区域设置切换。

我为实现这一目标所做的事情:

我将rack-contrib添加到我的Gemfile中:

gem 'rack-contrib', require: 'rack/contrib'
Run Code Online (Sandbox Code Playgroud)

ran bundle install,将中间件添加到 my config/application.rb

config.middleware.use Rack::Locale
Run Code Online (Sandbox Code Playgroud)

并检查我的控制器的请求环境:

puts request.env.keys.select{|v| v=~/rack/ }
Run Code Online (Sandbox Code Playgroud)

我运行的规范是控制器规范,它包含render_views在其中。

我的问题:

rack.locale请求环境中没有键。我仔细检查了一下rake middlware,它列Rack::Locale在最后,就在之前run MyApp::Application.routes

经过一些调试后,我发现运行时从未调用中间件

rspec spec/controllers/authentication_controller_spec.rb
Run Code Online (Sandbox Code Playgroud)

但是:运行相同的代码script/rails s thin可以在请求环境中提供更多键,即:

rack.request.cookie_string
rack.locale
rack.request.query_string
rack.request.query_hash
Run Code Online (Sandbox Code Playgroud)

所以,我想问题是:为什么 RSpec 拒绝选择 Rack 中间件?

now*_*owk 6

控制器规格不通过堆栈,它们几乎直接调用控制器本身。您可能需要为此使用 Rspec 的请求类型测试。