考虑到不基于传递的参数有些异常处理函数:
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'))));
(感谢格雷厄姆惠勒在谷歌的最后2个解决方案)。
我喜欢这种方法:
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");
});
一个例外是使用检查throwsA
与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>()));
});
对于简单的异常测试,我更喜欢用静态方法API:
Expect.throws(
// test condition
(){
throw new Exception('code I expect to throw');
},
// exception object inspection
(err) => err is Exception
);