Flutter集成测试忽略FirebaseException并续行遇问题求解决
解决Flutter集成测试中忽略FirebaseException并恢复FlutterError.onError的问题
你的问题根源是自定义方法没有保存并恢复原始的FlutterError.onError回调,测试框架检测到该回调被修改后未还原,所以抛出了报错。
修正后的restoreFlutterError方法需要:
- 先保存原始的
FlutterError.onError - 替换为自定义的错误处理逻辑
- 执行测试代码后,无论是否发生异常,都将
FlutterError.onError恢复为原始状态
修正后的代码如下:
Future<void> restoreFlutterError(Future<void> Function() call) async { // 保存原始的FlutterError.onError回调 final originalOnError = FlutterError.onError; try { // 设置自定义错误处理逻辑 FlutterError.onError = (FlutterErrorDetails data) { if (data.exception is FirebaseException) { // 忽略FirebaseException,不抛出 return; } // 其他错误交给原始回调处理 originalOnError?.call(data); }; // 执行传入的测试逻辑 await call(); } finally { // 无论是否出错,都恢复原始的onError回调 FlutterError.onError = originalOnError; } }
在testWidgets中的调用方式不变,但现在执行完测试逻辑后会自动恢复原始的错误处理回调,不会触发测试框架的报错:
testWidgets('test execution', (tester) async { await restoreFlutterError(() async { app.main(); await tester.pumpAndSettle(const Duration(seconds: 10)); }); // 后续测试逻辑... });
另外需要注意:如果你的测试逻辑中使用了expect()等断言,确保这些断言在restoreFlutterError方法执行完成后(也就是原始onError恢复后)运行,避免断言错误被自定义逻辑意外拦截。
内容的提问来源于stack exchange,提问作者Jagadeesh
相关产品推荐
相关产品推荐

