考虑一个函数,它根据传递的参数进行一些异常处理:
List range(start, stop) {
if (start >= stop) {
throw new ArgumentError("start must be less than stop");
}
// remainder of function
}
Run Code Online (Sandbox Code Playgroud)
如何测试是否引发了正确的异常?
Sha*_*uli 58
在这种情况下,有各种方法来测试异常.要简单地测试是否引发了异常:
expect(() => range(5, 5), throwsException);
Run Code Online (Sandbox Code Playgroud)
测试是否引发了正确的异常类型:
expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));
Run Code Online (Sandbox Code Playgroud)
确保不会引发任何异常:
expect(() => range(5, 10), returnsNormally);
Run Code Online (Sandbox Code Playgroud)
测试异常类型和异常消息:
expect(() => range(5, 3),
throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop')));
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
expect(() => range(5, 3),
throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop'))));
Run Code Online (Sandbox Code Playgroud)
(感谢Google的Graham Wheeler提供的最后两个解决方案).
作为@Shailen Tuli提议的更优雅的解决方案,如果您希望特定消息出现错误,您可以使用having
.
在这种情况下,您正在寻找这样的东西:
expect(
() => range(5, 3),
throwsA(
isA<ArgumentError>().having(
(error) => error.message, // The feature you want to check.
'message', // The description of the feature.
'start must be less than stop', // The error message.
),
),
);
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法:
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");
});
Run Code Online (Sandbox Code Playgroud)
虽然其他答案肯定是有效的,但类似的 APITypeMatcher<Type>()
现在已被弃用,并且您必须使用isA<TypeOfException>()
.
比如说之前的事情,
expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));
Run Code Online (Sandbox Code Playgroud)
现在将是
expect(() => range(5, 2), throwsA(isA<IndexError>()));
Run Code Online (Sandbox Code Playgroud)
使用throwsA
with检查异常TypeMatcher
。
注意:isInstanceOf现在已弃用。
List range(start, stop) {
if (start >= stop) {
throw new ArgumentError("start must be less than stop");
}
// remainder of function
}
test("check argument error", () {
expect(() => range(1, 2), throwsA(TypeMatcher<ArgumentError>()));
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4829 次 |
最近记录: |