RuboCop設定のCapybara cop名前空間移行と`have_content`廃止対応
CapybaraのRuboCop copがCapybara/RSpec名前空間へ移行したことに伴い、.rubocop.ymlの設定を更新し、新たに警告となったhave_contentをhave_textへ置き換えました。
背景
CapybaraのRuboCop拡張において、RSpec固有のcopがCapybara/RSpecサブ名前空間へ整理されました。これにより、従来のCapybara/CurrentPathExpectationやCapybara/MatchStyleなどのcop名が古いものとなり、新しいCapybara/RSpec/CurrentPathExpectationやCapybara/RSpec/MatchStyleへの移行が必要になっています。また、この更新にあわせてCapybara/RSpec/HaveContentという新しいcopが追加され、have_contentの使用箇所に警告を出すようになっています。
技術的な変更
.rubocop.ymlのCapybara関連cop設定が全面的に見直され、旧名称の削除・新名称への移行・新規copの追加が行われました。
主な変更点は以下のとおりです:
-
削除された旧名称:
Capybara/CurrentPathExpectation、Capybara/MatchStyle、Capybara/NegationMatcher、Capybara/NegationMatcherAfterVisit、Capybara/SpecificActions、Capybara/SpecificFinders -
追加された新名称:
Capybara/RSpec/CurrentPathExpectation、Capybara/RSpec/MatchStyle、Capybara/RSpec/NegationMatcher、Capybara/RSpec/NegationMatcherAfterVisit、Capybara/RSpec/SpecificMatcher、Capybara/RSpec/VisibilityMatcher -
新規追加cop:
Capybara/AssertStyle、Capybara/RSpec/HaveContent、Capybara/RSpec/HaveSelector(既存のCapybara/RSpec/HaveSelectorは引き続き有効)
Capybara/RSpec/HaveContentの追加により既存コードにoffenseが発生したため、features/step_definitions/配下の3ファイルでhave_contentをhave_textに置き換えています。
変更前:
have = is_css ? have_css(text) : have_content(text)
# ...
expect(page).to have_content text
変更後:
have = is_css ? have_css(text) : have_text(text)
# ...
expect(page).to have_text text
同様の置き換えがadditional_web_steps.rbおよびformat_steps.rbでも行われており、合計4箇所のhave_contentがhave_textに変更されています。
設計判断
新しいcopはすべてEnabled: trueで登録されており、警告を抑制する方向ではなく、コードをcop準拠の書き方に修正する方針が取られています。
PRではCapybara/RSpec/HaveContentのoffenseを# rubocop:disableで無効化するのではなく、実際にコードを修正する対応が取られています。Lint設定の有効化とコードの修正を同一PRで完結させることで、設定変更が未解決のoffenseを残した状態にならないよう管理されています。
まとめ
この変更はCapybaraのcop名前空間再編に追従したメンテナンス作業であり、.rubocop.ymlの設定とテストコードの双方を一貫して更新しています。特にhave_content廃止への対応をLint設定と同時に完結させた点は、設定変更がコードベースに与える影響を最小化する実践的なアプローチです。