简而言之,throwsA(anything)
在使用dart进行单元测试时不足以满足我的需求。如何测试特定错误消息或类型?
这是我想捕捉的错误:
class MyCustErr implements Exception {
String term;
String errMsg() => 'You have already added a container with the id
$term. Duplicates are not allowed';
MyCustErr({this.term});
}
这是当前通过的断言,但是要检查上面的错误类型:
expect(() => operations.lookupOrderDetails(), throwsA(anything));
这就是我想要做的:
expect(() => operations.lookupOrderDetails(), throwsA(MyCustErr));
答案 0 :(得分:12)
在Flutter 1.12.1中弃用了`TypeMatcher <>'之后,我发现这可行:
expect(() => operations.lookupOrderDetails(), throwsA(isInstanceOf<MyCustErr>()));
答案 1 :(得分:6)
截至 2021 年 4 月,这是正确的方法。
正确的方法
# when user client button
sock.send(request)
response = sock.recv().decode()
render(response)
一些例子显示:
不正确的方法
import 'package:dcli/dcli.dart';
import 'package:test/test.dart';
/// GOOD: works in all circumstances.
expect(() => restoreFile(file), throwsA(isA<RestoreFileException>()));
注意在 expect 之后缺少的 '() => '。
区别在于第一种方法适用于返回 void 的函数,而第二种方法则不能。
所以第一种方法应该是首选技术。
要测试特定的错误消息:
检查异常内容
import 'package:dcli/dcli.dart';
import 'package:test/test.dart';
/// BAD: works but not in all circumstances
expect(restoreFile(file), throwsA(isA<RestoreFileException>()));
答案 2 :(得分:1)
这应该做您想要的:
expect(() => operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));
expect(() => operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));
答案 3 :(得分:0)
如果有人想像我一样要做一个异步功能测试,您需要做的就是在期望中添加async
关键字,请记住lookupOrderDetails
是一个异步功能:
expect(() **async** => **await** operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));
expect(() **async** => **await** operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));
它仍然使用Gunter的答案,很好!
答案 4 :(得分:0)
首先导入正确的软件包'package:matcher / matcher.dart';
expect(() => yourOperation.yourMethod(),
throwsA(const TypeMatcher<YourException>()));
答案 5 :(得分:0)
当前期望函数调用抛出异常的正确方法是:
expect(operations.lookupOrderDetails, throwsA(isA<MyCustErr>()));`