中间件并不总是调用capybara功能测试(带机架测试)

时间:2014-01-13 22:24:33

标签: ruby-on-rails capybara rack-test

我有一个我正在研究的宝石,它使用铁路来添加中间件。非常简单的东西,几乎完全跟着导轨部分。在开发/舞台/制作中工作正常。

中间件在特定键的env初始化类似哈希的对象。

但是在我的水豚测试中,这个键只有有时初始化。我在中间件中添加了一个调试器,发现每次使用visit方法时都不会调用它。

更重要的是,在这个特定的spec文件中,有4个示例,每个示例调用visit一次。但是当我运行spec文件时,中间件有时被调用3次,有时被称为2次。显然,应该为每个请求调用中间件堆栈。


tl; dr:有时在我的capybara功能规范中调用visit(使用机架测试驱动程序)会导致我的中间件堆栈被调用。


帮助?

  • ruby​​ 2.0.0-p353
  • rails 4.0.2
  • capybara 2.2.1
  • rack-test 0.6.2

编辑:这是一些相关的代码:如何添加中间件及其功能。使用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

1 个答案:

答案 0 :(得分:0)

想出来了!

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

解决方法是在我的铁路上做到这一点:

app.middleware.insert_before Warden::Manager, MyGem::Middleware