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

使用http-mock-adapter mock Dio请求时路由匹配失败及报错问题

http-mock-adapter 两类Dio Mock报错修复方案

第一类报错:匹配不到POST路由

报错信息:Exception: Assertion failed: "Could not find mocked route matching request for POST /onboard/answer { data: {"pageId":"1"},

原因

http-mock-adapter默认对请求的校验规则包含请求方法、路径、请求体三个维度,你发送的POST请求携带了{"pageId":"1"}的请求体,但配置onPost规则时没有指定匹配的请求体,导致匹配失败。

修复

给onPost方法补充data参数,匹配请求的body内容,不需要校验body时也可直接设置data: null跳过校验:

test("should return 200", () async {
  const path = "/onboard/answer";
  final answerModel = AnswerModel(pageId: "1");
  dioAdapter.onPost(
    path, 
    (server) => server.reply(200, 200),
    // 匹配请求body
    data: answerModel.toJson(),
  );
  final result = await service.postOnboardingAnswer(answerModel);
  expect(result, isA<int>());
});

第二类报错:DioError直接抛出未处理

报错信息:Exception: DioError [DioErrorType.response]: {message: Some beautiful error!}

原因

你已经mock了GET接口返回404错误,调用对应的service方法时会直接抛出DioError,但原测试代码没有做异常捕获,且断言逻辑错误——错误场景下不会返回OnboardModel实例,而是抛出异常。

修复

调整测试断言逻辑,直接校验抛出的异常类型:

test("should return a DioError", () async {
  const path = "/onboard/page-date/0/lastAnswerId";
  final expectedError = DioError(
    error: {'message': 'Some beautiful error!'},
    requestOptions: RequestOptions(path: path),
    response: Response(
      statusCode: 404,
      requestOptions: RequestOptions(path: path),
    ),
    type: DioErrorType.response,
  );
  dioAdapter.onGet(path, (server) => server.throws(404, expectedError));
  // 校验方法抛出指定类型的异常
  expect(
    () async => await service.getOnboardingAnswer("lastAnswerId"),
    throwsA(isA<DioError>()),
  );
});

额外注意事项

如果多个测试用例共用同一个Dio实例和Adapter实例,需要在每个测试结束后清空已配置的mock路由,避免路由匹配冲突:

tearDown(() {
  dioAdapter.reset();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:03