Middlewareをテストしたい
対象モジュール
[railsのログにタグづけしたい ベジタブルプログラム](https://www.blog.v41.me/posts/c8804b8e-6ac2-450c-b5ea-9009c1a43da4)
テスト
RSpec.describe TaggedLogger do
subject { TaggedLogger::Middleware.new(app) }
let(:app) { ->(env) { [200, env, "app"] } }
let(:request) { Rack::MockRequest.new(subject) }
let(:action_dispatch_request) { ActionDispatch::TestRequest.create }
before do
allow(ActionDispatch::Request).to receive(:new).and_return(action_dispatch_request)
allow(action_dispatch_request).to receive(:session).and_return(Struct.new(:user_id, :loaded?).new(*session_methods))
allow(Rails.logger).to receive(:tagged).and_yield
request.get("/path/to/api")
end
context "user_idが存在する" do
let(:session_methods) { [1, true] }
it do
aggregate_failures do
expect(Rails.logger).to have_received(:tagged).with("user_id=1").ordered
expect(Rails.logger).to have_received(:tagged).once
end
end
end
end
参考
大まかに参考にした
ruby on rails - Testing Middleware with Rspec - Stack Overflow
Middlewareの引数の作成方法
taggedはblockをゴニョゴニョする必要があった
ActionDispatch::Request
のモックを作成