59

渡された引数に基づいていくつかの例外処理を行う関数について考えてみます。

List range(start, stop) {
    if (start >= stop) {
      throw new ArgumentError("start must be less than stop");
    }
    // remainder of function
}

正しい種類の例外が発生したことをテストするにはどうすればよいですか?

4

7 に答える 7

135

この場合、例外をテストするさまざまな方法があります。不特定の例外が発生することを単純にテストするには、次のようにします。

expect(() => range(5, 5), throwsException);

正しいタイプの例外が発生することをテストするには:

throwsArgumentErrorthrowsRangeError、などの一般的な目的で定義済みのマッチャーがいくつかありthrowsUnsupportedErrorます。定義済みのマッチャーが存在しないタイプについては、 を使用できますTypeMatcher<T>

expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));

例外が発生しないようにするには:

expect(() => range(5, 10), returnsNormally);

例外タイプと例外メッセージをテストするには:

expect(() => range(5, 3), 
    throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop')));

これを行う別の方法を次に示します。

expect(() => range(5, 3), 
  throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop'))));

(最後の 2 つのソリューションについては、Google の Graham Wheeler に感謝します)。

于 2012-11-08T22:33:34.053 に答える
16

私はこのアプローチが好きです:

test('when start > stop', () {
  try {
    range(5, 3);
  } on ArgumentError catch(e) {
    expect(e.message, 'start must be less than stop');
    return;
  }
  throw new ExpectException("Expected ArgumentError");  
});
于 2012-11-08T22:42:50.087 に答える
3

他の回答は間違いなく有効ですが、 のような APITypeMatcher<Type>()は現在廃止されており、使用する必要がありますisA<TypeOfException>()

たとえば、以前は、

expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));

今になる

expect(() => range(5, 2), throwsA(isA<IndexError>()));
于 2020-12-09T05:51:18.267 に答える
2

単純な例外テストでは、静的メソッドAPIを使用することを好みます。

Expect.throws(
  // test condition
  (){ 
    throw new Exception('code I expect to throw');
  },
  // exception object inspection
  (err) => err is Exception
);
于 2012-11-09T16:20:34.823 に答える