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

含3个expect断言的单元测试失效,如何改写该测试用例?

400错误响应单元测试改写方案

原测试存在两个核心问题:

  1. 第一个断言写法错误:expect(() => call, throwsA(...))中的call是已触发的Future对象,无法正确捕获异步异常
  2. 重复调用getTransactionByHash,导致mock逻辑被触发两次,可能干扰断言结果

以下是两种可行的改写方式:

方式一:Try-Catch包裹单次调用

test('400 bad response', () async {
  // 配置mock行为
  when(
    () => sampleClient.getTransaction('1'),
  ).thenThrow(DioError(
    response: Response(
      statusCode: 400,
      data: badRepsonseJson,
      requestOptions: RequestOptions(path: ''),
    ),
    requestOptions: RequestOptions(path: ''),
  ));

  try {
    await sampleService.getTransactionByHash('1');
    // 若未抛出异常,直接标记测试失败
    fail('未抛出预期的SampleException');
  } on SampleException catch (e) {
    expect(e, isA<SampleException>()); // 断言异常类型
    expect(e.errorCode, badResponse.statusCode); // 断言错误码匹配
    expect(e.message, badResponse.message); // 断言错误消息匹配
  }
});

方式二:使用expectLater捕获异常并断言属性

test('400 bad response', () async {
  // 配置mock行为
  when(
    () => sampleClient.getTransaction('1'),
  ).thenThrow(DioError(
    response: Response(
      statusCode: 400,
      data: badRepsonseJson,
      requestOptions: RequestOptions(path: ''),
    ),
    requestOptions: RequestOptions(path: ''),
  ));

  // 发起异步调用并捕获异常
  final future = sampleService.getTransactionByHash('1');
  final exception = await expectLater(
    future,
    throwsA(isA<SampleException>()),
  ) as SampleException;

  // 断言异常的具体属性
  expect(exception.errorCode, badResponse.statusCode);
  expect(exception.message, badResponse.message);
});

改写核心要点

  • 仅调用一次getTransactionByHash,避免重复触发mock逻辑
  • 确保异步异常被正确捕获,同时完成类型、错误码、错误消息的三重断言

内容的提问来源于stack exchange,提问作者Alvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:31:20