You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:40:27