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

时间:2013-02-22 14:37:04

标签: ruby-on-rails-3 rack rspec-rails rack-middleware

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

我为实现这一目标所做的工作:

我在我的Gemfile中添加了rack-contrib:

gem 'rack-contrib', require: 'rack/contrib'

运行bundle install,将中间件添加到我的config/application.rb

config.middleware.use Rack::Locale

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

puts request.env.keys.select{|v| v=~/rack/ }

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

我的问题:

请求环境中没有rack.locale个密钥。我仔细检查了rake middlware,它在Rack::Locale之前的run MyApp::Application.routes列出了rspec spec/controllers/authentication_controller_spec.rb

经过一些调试后,我发现在运行

时从未调用过中间件
script/rails s thin

但是:rack.request.cookie_string rack.locale rack.request.query_string rack.request.query_hash 中运行相同的代码会在请求环境中为我提供更多密钥,即:

{{1}}

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

1 个答案:

答案 0 :(得分:3)

控制器规格不会通过堆栈,它们几乎直接在控制器本身上调用。您可能希望使用Rspec的请求类型测试。