🌊

RSpec/NestedGroups: Maximum example group nesting exceed[◯/◯]. の対処法

2024/03/26に公開

背景

Rubyのコードの整形機能であるRuboCopを実行した時、
RSpecで書いたテストコードで以下のエラーが発生しました。

$ bundle exec rubocop
Inspecting 〇〇 files
.........................................C..C..

Offenses:

spec/〇〇_.rb:52:3: C: Metrics/MethodLength: Method has too many lines. [28/20]
  def data_shape ...
  ^^^^^^^^^^^^^^
spec//〇〇_spec.rb:43:7: C: RSpec/NestedGroups: Maximum example group nesting exceeded [4/3].
      context '正しい値が入力された場合' do

1行目のエラーは今回は触れずに2行目のエラーに焦点を当てます

解決策

上のエラーメッセージは、RSpecのテストスイート内でネストされたテストグループが許される最大のネストレベルを超えているると怒られています

具体的には、テストファイル〇〇spec.rbの43行目で、ネストされたcontextブロックが3つ以上ネストされていて上のエラーが出ています。
RuboCopのRSpec/NestedGroupsルールは、テストのネスト数などを制限することでコードの品質を落とさないようにしています。

このエラーメッセージを解決するには、テストスイート内のテストグループのネストレベルを3以下に減らす必要があります
ネストレベルを減らす方法は、テストをよりフラットに構造化するといいみたいです。

例えば、テストケースやコンテキストを分割し、ネストされたブロックを削除することが考えられます。

context '正しい値が入力された場合' do
  it '何らかのテスト' do
    # テストのコード
  end
end

この場合、contextブロックがネストされているため、ネストを解消することができるでしょう。例えば、次のようにリファクタリングできるみたいです。

context '正しい値が入力された場合、何らかのテスト' do
  it '具体的なテスト1' do
    # テストのコード
  end

  it '具体的なテスト2' do
    # テストのコード
  end
end

こうすることで、ネストを削減し、RSpec/NestedGroupsエラーを解決できるみたいです。

ネストが深くなりすぎると、コードが読みにくく、メンテナンスが難しくなり、レビュアーや後から入ってきたエンジニアに迷惑がかかります。

参考

ChatGptより参考にさせてもらいました。

2023年9月に書いた記事です。

Discussion