考虑一个基于传递的参数进行一些异常处理的函数:
List range(start, stop) {
if (start >= stop) {
throw new ArgumentError("start must be less than stop");
}
// remainder of function
}
如何测试是否引发了正确的异常?
考虑一个基于传递的参数进行一些异常处理的函数:
List range(start, stop) {
if (start >= stop) {
throw new ArgumentError("start must be less than stop");
}
// remainder of function
}
如何测试是否引发了正确的异常?
在这种情况下,有多种方法可以测试异常。简单地测试是否引发了非特定异常:
expect(() => range(5, 5), throwsException);
测试是否引发了正确类型的异常:
有几个用于一般用途的预定义匹配器,例如throwsArgumentError
, throwsRangeError
,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'))));
(感谢 Google 的 Graham Wheeler 提供的最后两个解决方案)。
我喜欢这种方法:
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");
});
作为@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.
),
),
);
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>()));
});
虽然其他答案绝对有效,TypeMatcher<Type>()
但现在不推荐使用类似的 API,您必须使用isA<TypeOfException>()
.
比如之前的,
expect(() => range(5, 2), throwsA(TypeMatcher<IndexError>()));
现在将
expect(() => range(5, 2), throwsA(isA<IndexError>()));
对于简单的异常测试,我更喜欢使用静态方法 API:
Expect.throws(
// test condition
(){
throw new Exception('code I expect to throw');
},
// exception object inspection
(err) => err is Exception
);
我使用了以下方法:
首先,您需要将您的方法作为 lambda 传递给 expect 函数:
expect(() => method(...), ...)
其次,您需要throwsA
结合使用isInstanceOf
.
throwsA
确保抛出异常,并且isInstanceOf
您可以检查是否抛出了正确的异常。
我的单元测试示例:
expect(() => parser.parse(raw), throwsA(isInstanceOf<FailedCRCCheck>()));
希望这可以帮助。