Railtie を使用してミドルウェアを追加する作業をしている宝石があります。非常に単純なもので、レールガイドセクションにほぼ正確に従いました。開発/ステージング/本番環境で正常に動作します。
env
ミドルウェアは、特定のキーでハッシュのようなオブジェクトを初期化します。
しかし、私のカピバラ テストでは、このキーは時々初期化されるだけです。visit
ミドルウェアにデバッガーを追加したところ、メソッドを使用するたびにデバッガーが呼び出されないことがわかりました。
さらに、この特定の仕様ファイルには 4 つの例があり、各例がvisit
1 回呼び出されます。しかし、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