我有一个我正在研究的宝石,它使用铁路来添加中间件。非常简单的东西,几乎完全跟着导轨部分。在开发/舞台/制作中工作正常。
中间件在特定键的env
初始化类似哈希的对象。
但是在我的水豚测试中,这个键只有有时初始化。我在中间件中添加了一个调试器,发现每次使用visit
方法时都不会调用它。
更重要的是,在这个特定的spec文件中,有4个示例,每个示例调用visit
一次。但是当我运行spec文件时,中间件有时被调用3次,有时被称为2次。显然,应该为每个请求调用中间件堆栈。
tl; dr:有时在我的capybara功能规范中调用visit
(使用机架测试驱动程序)不会导致我的中间件堆栈被调用。
帮助?
编辑:这是一些相关的代码:如何添加中间件及其功能。使用Capybara的visit
方法时,MyGem :: Middleware#调用只有有时被调用。
# 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
答案 0 :(得分:0)
想出来了!
我还添加了一个Warden钩子,期望在用户进出签名后添加env密钥,如果在我的gem中间件之前添加了Warden :: Manager中间件,那么在运行我的钩子时会出错期望设置env键。
解决方法是在我的铁路上做到这一点:
app.middleware.insert_before Warden::Manager, MyGem::Middleware