7

在我的应用程序中,我将颤振 onError 记录到 crashalytics,

FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;

在运行集成测试时,如果发生一些异常,我会在控制台中得到以下语句并且测试只是挂起,

运行测试时引发以下异常:I/flutter (30479):测试覆盖了 FlutterError.onError 但未能将其返回到原始状态,或者出现无法处理的意外附加错误。通常,这是由在恢复 FlutterError.onError 之前使用 expect() 引起的。

控制台中的上述消息表明onError覆盖有问题,我如何根据控制台FlutterError.onError中的建议返回其原始状态。

请注意,我正在使用新推荐的集成测试方式,

4

3 回答 3

3

onError是 的公共静态成员FlutterError,所以从技术上讲,它可以被任何地方的任何人覆盖。在运行测试主体之前,函数本身也会用自己的错误处理程序testWidgets()覆盖。FlutterError.onError您可以阅读其源代码以获取更多信息。

基本上,以下是发生的事情:

testWidgets('', (tester) async { // onError is overridden with the handler of the test framework
  await app.main(); // onError is overridden again with crashlytics error handler
  //...
  expect(); // Flutter yells that you should have not touched its onError
});

关键是 Flutter 测试框架需要它onError才能正常工作。所以无论你做什么,记得调用测试框架的错误处理程序。

以下是我在项目中用来“恢复” FlutterError.onError(并做其他事情)的方式:

testWidgets('', (tester) async {
  final originalOnError = FlutterError.onError!;
  FlutterError.onError = (FlutterErrorDetails details) {
    // do something like ignoring an exception
    originalOnError(details); // call test framework's error handler
  };
  // ...
  expect();
});

通过一些修改,我认为您的问题是可以解决的。

于 2021-12-10T16:52:31.803 回答
0

嗯,好的..似乎我们有几个与此相关的问题:link-1link-2link-3

长话短说:目前该integration_test库似乎仅针对“快乐路径”进行了优化。

就我而言,Firebase 与integration_test启用此行时发生冲突:

   FirebaseMessaging.onBackgroundMessage(_onBackgroundOrTerminatedHandler);

一旦我禁用它(运行集成测试时),错误就消失了。

于 2021-05-04T16:53:26.607 回答
-1

尝试更新到flutter 2.5.0。这似乎是固定在那里。

运行测试时不再卡住。所以它继续执行其余的测试。虽然它仍然显示_pendingExceptionDetails != null错误

于 2021-09-15T20:59:34.123 回答