Post

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

How to test rack middleware · GitHub

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

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

ActionDispatch::Request のモックを作成

ActionDispatch::TestRequest

This post is licensed under CC BY 4.0 by the author.