Techioz Blog

Ruby デバッガで rspec Expect ステートメントを実行するにはどうすればよいですか?

概要

半複雑な期待値を書きたいときはいつも、マッチャーをどうやって組み合わせることができるかを考えて、マッチャーをいじる必要があります。たとえば、ハッシュの配列のすべてのハッシュにキーがないことをテストしたい場合、最初の直感は次のようなものを書くことかもしれません。

Expect(the_array).to all(not(have_key(:the_key)))

これは私のコードでは機能しませんが、重要ではありません。私が聞きたいのは、ブレークポイントを追加して、期待値を修正するために何度も素早く反復するにはどうすればよいでしょうか?デバッガーでexpect行を実行するだけでテストは終了します。これは、デバッグセッションから抜け出すことを意味します。

実際にテストを終了せずに、期待が機能する場合に true/false を取得できるように、expect の「ドライラン」モードはありますか?それとも、expect ステートメントの後半を単独で実行できますか?

Rubymineのデバッガでexpectラインを実行してみました。

デバッグモードを終了せずにこの行が実行されることを期待しています。

解決策

RSpec::Support.with_failure_notifier の文書化されていない (内部) ヘルパー メソッドがあります。これを使用すると、失敗時にエラーを発生させないようにすることができます。

RSpec::Support.with_failure_notifier(
  ->(failure, options) {
    puts failure, options
  }
) do
  expect(:foo).to(eq(:bar))
end

または、セッション内で障害通知を永続的にオーバーライドします

RSpec::Support.failure_notifier = ->(failure, options) {
  puts failure, options
}

これで、すべての期待はエラーをスローするのではなく、失敗を出力するだけになります。