Cookies テストのヘルパーメソッド抽出によるリファクタリング
Action Pack の cookies_test.rb で重複した環境取得とクッキー取得コードがヘルパーメソッドに置き換えられ、テストの可読性と保守性が向上しました。
背景
テスト内部で頻出していた @request.env["action_dispatch.*"] や @controller.send :cookies の直接呼び出しは、同一パターンが散在しコードが冗長化していました。大規模な PR の中でこの重複を解消したいが、差分を増やさずに本来の変更点に集中したいという動機から、まずはヘルパーメソッドだけを切り出す独立 PR が作成されました。結果として、テストロジック自体は変わらず、記述が一元化されただけのシンプルなリファクタリングとなりました。
技術的な変更
controller_cookies というプライベートメソッドを追加し、従来の @controller.send :cookies 呼び出しを置き換えました。これによりローカル変数 cookies がテストクラスに既存の cookies メソッドと衝突するリスクを回避しつつ、意図が明確になります。
@@
- cookies = @controller.send :cookies
- assert_not_equal 45, cookies[:user_id]
- assert_equal 45, cookies.signed[:user_id]
+ assert_not_equal 45, controller_cookies[:user_id]
+ assert_equal 45, controller_cookies.signed[:user_id]
同様に、環境変数へのアクセスも key_generator、signed_cookie_salt などのヘルパーに置き換えられました。元のコードでは @request.env["action_dispatch.key_generator"] などを逐一参照していましたが、メソッド化することで行数が削減され、テスト意図が読み取りやすくなります。
@@
- key_generator = @request.env["action_dispatch.key_generator"]
- secret = key_generator.generate_key(@request.env["action_dispatch.signed_cookie_salt"])
+ secret = key_generator.generate_key(signed_cookie_salt)
これらの変更は、テストの振る舞い自体を変更しません。controller_cookies や key_generator が返すオブジェクトは元の呼び出しと同一であるため、アサーション結果は従来と一致します。
設計判断
テストコード内で cookies という名前はすでにテストフレームワークが提供しているメソッドと競合する可能性があるため、別名 controller_cookies を採用しました。この選択は名前衝突を防ぎつつ、意図的にコントローラのクッキーインスタンスへアクセスすることを明示しています。さらに、@request.env への直接アクセスをラップすることで、環境キーが将来的に変更された場合でもヘルパーのみを修正すればテスト全体に影響が及びません。結果として、変更点が局所化され、テストスイートの保守コストが低減します。
まとめ
cookies_test.rb の重複コードをヘルパーメソッドに抽出したことにより、テストの可読性が向上し、名前衝突回避と将来の拡張性が確保されました。機能的な違いはなく、リファクタリングとしての価値が明確です。