Techioz Blog

単一の期待値でカスタム例外をテストしますか?

概要

入力で例外を発生させるテストしたい関数がありますが、その例外には単なるメッセージ以外の情報も含まれているため、それもテストしたいと考えています。そこで、rspec ドキュメントにあるように、次のようなことを行いました。

it 'raises the correct exception' do
   expect { my_call }.to raise_error do |error|
     expect(error.some_field).to eq('some data')
   end
end

これはうまく機能しますが、RSpec/MultipleExpectations 警官と衝突します。

RSpec/MultipleExpectations: Example has too many expectations [2/1]

私の知る限り、複数の期待なしに、このようにブロック形式で raise_error を使用することは不可能です。仕様内でレスキューを伴うひどいことをせずに、例外を通常どおりに仕様できるように、発生した例外を何らかの方法でサンプルの外に保存する方法はありますか?それともカスタムの raise_custom_error マッチャーを使用する必要がありますか?

解決策

Rubocop はデフォルトで、ブロックごとに期待値が 1 つだけであるという警告を有効にしていると思います。これをrubocop.ymlに追加して無効にできます。

# Disables "Too many expectations."
RSpec/MultipleExpectations:
  Enabled: false

または、特定の仕様に対してのみ無効にしたい場合は、次のようなコメントを追加して無効にすることができます。コメントでルール名を使用すると、この方法で任意のrubocopルールを無効にできることに注意してください。

# rubocop:disable RSpec/MultipleExpectations
it 'raises the correct exception' do
  expect { my_call }.to raise_error do |error|
    expect(error.some_field).to eq('some data')
  end
end
# rubocop:enable RSpec/MultipleExpectations

it 'does something else' do
  expect(true).to be true
end

Rubocop の構文オプションの詳細については、この回答を参照してください