メインコンテンツまでスキップ

失敗の集約

通常、期待値の失敗は例が直ちに中断されます。複数の独立した期待値がある場合、最初の失敗だけでなく、すべての失敗を見ることができると便利です。1つの解決策は、各期待値ごとに別々の例を作成することですが、例のセットアップが遅い場合、追加の時間がかかり、処理が遅くなります。aggregate_failuresは、代替解を提供します。これは、一連の期待値をブロックでラップします。ブロック内では、通常のように期待値の失敗が直ちに中断されず、代わりに失敗が単一の例外に集約され、ブロックの最後に発生します。これにより、失敗したすべての期待値を確認することができます。

aggregate_failuresは、集約された失敗メッセージとして使用されるオプションの文字列引数を取ります。

RSpec::Coreは、この機能を少し拡張しています。詳細については、rspec-coreドキュメントを参照してください。

注意:aggregate_failuresの実装はスレッドローカル変数を使用しているため、別のスレッドで期待値の失敗が発生すると、通常どおり中断されます。

aggregate_failures内の複数の期待値の失敗はすべて報告されます

Given "spec/aggregated_failure_spec.rb"という名前のファイルが次の内容であるとき:

require 'rspec/expectations'
include RSpec::Matchers

Response = Struct.new(:status, :headers, :body)
response = Response.new(404, { "Content-Type" => "text/plain" }, "Not Found")

begin
aggregate_failures "testing response" do
expect(response.status).to eq(200)
expect(response.headers["Content-Type"]).to eq("application/json")
expect(response.body).to eq('{"message":"Success"}')
end
rescue RSpec::Expectations::MultipleExpectationsNotMetError => e
puts e.message.gsub(/(:in).+/, '')
exit(1)
end

When ruby spec/aggregated_failure_spec.rbを実行すると

Then 以下のように失敗するはずです:

Got 3 failures from failure aggregation block "testing response":

1) expected: 200
got: 404

(compared using ==)

spec/aggregated_failure_spec.rb:9

2) expected: "application/json"
got: "text/plain"

(compared using ==)

spec/aggregated_failure_spec.rb:10

3) expected: "{"message":"Success"}"
got: "Not Found"

(compared using ==)

spec/aggregated_failure_spec.rb:11