1

Railtie を使用してミドルウェアを追加する作業をしている宝石があります。非常に単純なもので、レールガイドセクションにほぼ正確に従いました。開発/ステージング/本番環境で正常に動作します。

envミドルウェアは、特定のキーでハッシュのようなオブジェクトを初期化します。

しかし、私のカピバラ テストでは、このキーは時々初期化されるだけです。visitミドルウェアにデバッガーを追加したところ、メソッドを使用するたびにデバッガーが呼び出されないことがわかりました。

さらに、この特定の仕様ファイルには 4 つの例があり、各例がvisit1 回呼び出されます。しかし、spec ファイルを実行すると、ミドルウェアが3 回呼び出されることもあれば、2 回呼び出されることもあります明らかに、すべてのリクエストに対してミドルウェア スタックを呼び出す必要があります。


tl;dr:visitカピバラの機能仕様 (ラック テスト ドライバーを使用) を呼び出しても、ミドルウェア スタックが呼び出されないことがあります。


ヘルプ?

  • ルビー 2.0.0-p353
  • レール 4.0.2
  • カピバラ 2.2.1
  • ラックテスト 0.6.2

編集:これは、ここに関連するコードの一部です:ミドルウェアがどのように追加され、何をするか。MyGem::Middleware#call は、カピバラのメソッドを使用する場合にのみ呼び出されます。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