如何在Dart测试中捕获类型转换错误(TypeError)
正确编写类型转换异常捕获测试用例
问题说明
要验证VersionModel解析类型错误的JSON时抛出类型转换异常,之前的测试写法因为断言错误的异常类型,导致无法正确捕获目标异常。
核心问题
Dart里类型转换失败(比如报错type 'String' is not a subtype of type 'bool?')抛出的是CastError,不是TypeError,所以原来断言isInstanceOf<TypeError>()肯定不匹配。
正确测试代码
推荐写法:用测试框架内置的throwsA匹配器
这种写法更简洁,符合测试最佳实践:
test("解析类型错误的JSON时应抛出类型转换异常", () { expect( () => VersionModel.fromJson(jsonError), throwsA(isA<CastError>()), ); });
备选写法:手动try-catch(适合需要验证异常细节的场景)
如果要进一步校验异常的具体信息,可以这么写:
test("解析类型错误的JSON时应抛出类型转换异常", () { try { VersionModel.fromJson(jsonError); fail("没抛出预期的类型转换异常"); // 走到这说明测试失败 } on CastError catch (e) { // 可以验证异常消息是否符合预期 expect(e.toString(), contains("type 'String' is not a subtype of type 'bool?'")); // 或者只验证异常类型 expect(e, isA<CastError>()); } });
额外提示
- 别再用
TypeError断言了,Dart的类型转换错误都是CastError类型。 - 用
throwsA的时候,要把目标方法包在一个匿名函数里(() => ...),不然方法会直接执行,测试框架没法捕获异常。
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

