対象モジュール

[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の引数の作成方法

How to test rack middleware · GitHub

taggedはblockをゴニョゴニョする必要があった

RSpecでブロック内部の挙動を確認するテスト · GitHub

ActionDispatch::Request のモックを作成

ActionDispatch::TestRequest