Dart异步请求测试脚本执行失败问题排查
Flutter测试异步网络请求失败:DigitalCardModel实例不匹配
现有业务代码可正常运行,但编写的Flutter测试脚本无法完成执行。测试脚本中调用异步网络请求获取DigitalCardModel,第一个测试就报错,提示预期与实际的DigitalCardModel实例不匹配,实际返回空实例,疑似未等待异步请求完成。
测试脚本
import 'package:members_info/models/digital_card_model.dart'; import 'package:members_info/network/network_digital_card.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { DigitalCardModel testAndrew = DigitalCardModel.fromJson({ "name":"Andrew", "phone": "", "expired": "Y", "lapsing": "Y", "externalid": "29033" }); DigitalCardModel testSarah = DigitalCardModel.fromJson({ "name":"Sarah", "phone": "", "expired": "N", "lapsing": "N", "externalid": "13" }); group("Test DigitalCardModel request", () { test('Andrew', () async { DigitalCardModel digitalCard = await NetworkDigitalCard().getDigitalCard('andrew@acme.com'); expect(digitalCard, testAndrew); }); test('Sarah', () async { DigitalCardModel digitalCard = await NetworkDigitalCard().getDigitalCard('sarah@acme.com'); expect(digitalCard, testSarah); }); }); }
测试错误信息
Exception has occurred.
TestFailure (Expected: <Instance of 'DigitalCardModel'>
Actual: <Instance of 'DigitalCardModel'>
)
运行测试时出现上述错误,且无法进入第二个测试。
应用中调用网络请求的代码
late Future<DigitalCardModel> digitalCard = NetworkDigitalCard().getDigitalCard(_email);
网络请求代码
import 'package:dio/dio.dart'; import 'package:members_info/extensions/string.dart'; import 'package:members_info/models/digital_card_model.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; class NetworkDigitalCard { String getUrl(email) => 'https://acme.com/jsonCardDetails?email=$email'; // 供页面调用的方法 Future<DigitalCardModel> getDigitalCard(String email) async { if (!email.isValidEmail) { return DigitalCardModel( name: "Invalid Email", phone: "", expired: "", lapsing: "", externalid: 0); } try { Response<dynamic> response = await Dio().get(getUrl(email)); if (response.data['unknown'] == true) { return DigitalCardModel(externalid: response.data['externalid']); } // 返回有效数据 return DigitalCardModel.fromJson(response.data); } catch (exception, stackTrace) { await Sentry.captureException( exception, stackTrace: stackTrace, ); } return DigitalCardModel(); } Future<DigitalCardModel> refreshContent(String email) async { return getDigitalCard(email); } }
Flutter环境信息
Flutter (Channel stable, 3.10.6, on macOS 13.5 22G74 darwin-x64, locale en-AU) • Flutter version 3.10.6 on channel stable at /Users/sarah/development/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision f468f3366c (9 weeks ago), 2023-07-12 15:19:05 -0700 • Engine revision cdbeda788a • Dart version 3.0.6 • DevTools version 2.23.1
内容的提问来源于stack exchange,提问作者Sarah K
相关产品推荐
相关产品推荐

