使用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
相关产品推荐
相关产品推荐

