含3个expect断言的单元测试失效,如何改写该测试用例?
400错误响应单元测试改写方案
原测试存在两个核心问题:
- 第一个断言写法错误:
expect(() => call, throwsA(...))中的call是已触发的Future对象,无法正确捕获异步异常 - 重复调用
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
相关产品推荐
相关产品推荐

