Lint/DuplicateMethods のフォルスポジティブをスペックから除外
RuboCopの Lint/DuplicateMethods ルールが、動的クラスを多用するrspecのスペックファイルで誤検知を起こしていたため、スペックディレクトリをルールの除外対象に追加しました。
背景
Lint/DuplicateMethods は、同一クラス内に同名メソッドが複数定義されている場合に警告するRuboCopのルールです。rspecのスペックでは、テストのセットアップ時に動的にクラスを生成し、そのクラスにメソッドを定義するパターンが頻繁に使われます。
問題は、Lint/DuplicateMethods が変数名のスコープを正しく解釈できない点にあります。異なる動的クラスに対して同じメソッド名を定義した場合でも、ルールがそれを「同一クラスへの重複定義」と誤認識し、警告を発します。PRの説明によれば、「変数名が同じであっても異なるクラスになる」という点をルールが理解できないことが根本原因であり、rspecのコードベースでは動的クラスの生成が広く使われているため、この誤検知が多発していました。
技術的な変更
common_rubocop_config.yml に Lint/DuplicateMethods の除外設定が追加されました。
変更後:
Lint/DuplicateMethods:
Exclude:
- '*/spec/**/*_spec.rb'
除外パターン */spec/**/*_spec.rb は、任意のディレクトリ配下の spec/ ディレクトリに含まれる _spec.rb 末尾のファイルすべてを対象にします。スペックファイル以外のプロダクションコードにはルールが引き続き適用されるため、実装コードでの本物の重複メソッド定義は検出されます。
設計判断
ルールを全体で無効化するのではなく、スコープを絞った除外 が採用されました。
本PRではスペックファイルのみを Exclude に指定することで、プロダクションコードに対する Lint/DuplicateMethods の保護を維持したまま、フォルスポジティブが発生しやすいスペックだけを対象外にしています。動的クラス定義というテストに特有のパターンと、実装コードの品質保証という関心事を、ルールの適用範囲で明確に分離した判断です。
動的クラス生成を多用するテストコードにおける静的解析の限界を認識しつつ、プロダクションコードへの品質チェックを損なわない形でRuboCopの設定を調整した変更です。フォルスポジティブを受け入れてツールの警告を無視するのではなく、適用範囲を明示的に制御するアプローチは、lintルール管理の参考になります。