失敗の集約
通常、期待値の失敗は例が直ちに中断されます。複数の独立した期待値がある場合、最初の失敗だけでなく、すべての失敗を見ることができると便利です。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