我有一个我正在研究的 gem,它使用 railtie 添加中间件。非常简单的东西,几乎完全遵循了rails guides部分。在开发/登台/生产中工作正常。
中间件env
在特定键处初始化一个类似哈希的对象。
但是在我的 capybara 测试中,这个键有时会被初始化。我在中间件中添加了一个调试器,发现每次使用该visit
方法时都不会调用它。
更重要的是,在这个特定的规范文件中,有 4 个示例,每个示例调用visit
一次。但是当我运行规范文件时,中间件有时被调用 3 次,有时被调用 2 次。显然,应该为每个请求调用中间件堆栈。
tl; dr:有时调用visit
我的 capybara 功能规范(使用机架测试驱动程序)不会导致调用我的中间件堆栈。
帮助?
- 红宝石 2.0.0-p353
- 导轨 4.0.2
- 水豚 2.2.1
- 机架测试 0.6.2
编辑:这是这里的一些相关代码:如何添加中间件以及它的作用。MyGem::Middleware#call 只有在使用 Capybara 的方法时才会被visit
调用。
# railtie.rb
module MyGem
class Railtie < Rails::Railtie
initializer "my_gem.configure_rails_initialization" do |app|
app.middleware.use MyGem::Middleware
end
end
end
# middleware.rb
module MyGem
class Middleware
def initialize(app, options={})
@app = app
# options unused
end
def call(env)
# using a special internal version of the Rack::Session::Cookie class
session = MyGem::Rack::Session::Cookie.new(
@app,
:coder => MyGem::Rack::Session::Cookie::Base64::Marshal.new,
:key => ENV_SESSION_KEY,
:path => '/',
:domain => domain(env),
:expire_after => 6.weeks.to_i, # seconds till this expires
:secret => 'my_gem_secret_14f1c4ad25a6be00fe53f5fd2d746167',
)
# use Rack::Session:Cookie method
session.context(env, @app)
end
end
end