1

我有一个我正在研究的 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
4

1 回答 1

0

弄清楚了!

我还添加了一个 Warden 钩子,它期望在用户登录和退出后添加 env 密钥,如果在我的 gem 的中间件之前添加了 Warden::Manager 中间件,那么在运行我的钩子时它会出错要设置的 env 键。

解决方案是在我的 railtie 中执行此操作:

app.middleware.insert_before Warden::Manager, MyGem::Middleware
于 2014-01-14T01:08:02.903 回答