Flutter:如何正确实现FlutterError.OnError

问题描述 投票:0回答:3

有人可以告诉我如何在小部件测试期间实现覆盖颤动错误,以便我可以检查自己的自定义错误。

我在网上看到过提到这一点的片段,但我的所有实现都失败了

void main() {

  testWidgets('throws an error when scanning unknown term types', (WidgetTester tester) async {
    await tester.pumpWidget(injectTestWidget(new ItemScanScreen()));

    await tester.enterText(find.byKey(new Key('term')), '');
    await tester.tap(find.byIcon(Icons.send));
    await tester.pump();

    expect(
      tester.takeException(),
      isInstanceOf<UnrecognizedTermException>(),
      reason: 'should have thrown an UnrecognizedTermException error but didn\'t',
    );
  });
}

上面的代码失败并显示以下消息,即使它看起来实际上“捕获”了我的错误:

The following UnrecognizedTermException was thrown running a test:
Instance of 'UnrecognizedTermException'
...

我读到你可以做类似下面的代码片段的事情,但它没有看到如何/在哪里实现它:

final errorHandled = expectAsync0((){});

FlutterError.onError = (errorDetails) {
  // handle error
  errorHandled();
});
dart flutter flutter-test
3个回答
15
投票

我在生产中使用下面的代码将错误记录到服务器。

main.dart:

import 'dart:async';
import 'package:flutter/material.dart';
import 'logging.dart';

void main() async {
  FlutterError.onError = (FlutterErrorDetails details) async {
    new ErrorLogger().logError(details);
  };
  runZoned<Future<void>>(() async {
    // Your App Here
    runApp(MainApp());
  }, onError: (error, stackTrace) {
    new ErrorLogger().log(error, stackTrace);
  });
}

logging.dart:

class ErrorLogger {

  void logError(FlutterErrorDetails details) async {
    //FlutterError.dumpErrorToConsole(details);
    _sendToServer(details.exceptionAsString(), details.stack.toString());
  }

  void log(Object data, StackTrace stackTrace) async {  
      // print(data);
      // print(stackTrace);
    _sendToServer(data.toString(), stackTrace.toString());
  }

  void _sendToServer(String a, String b) async {
    // Implementation here
  }
}

4
投票

这是为测试而设计的。我切换到在 try/catch 中包装逻辑,然后在“错误消息文本”当前概念上运行 Expect() 。例如:

try {
   throw new UnrecognizedTermException();
 } catch (e) {
   setState(() => _status = e.errMsg());
}

// then in my test
expect(find.text('Could not determine the type of item you scanned'), findsOneWidget);

0
投票

下面的版本对我有用,在巡逻集成测试期间我们需要忽略

NetworkImageLoadException

Future<void> ignoreNetworkImageLoadException() async {
    final originalOnError = FlutterError.onError!;
    FlutterError.onError = (FlutterErrorDetails data) {
      final e = data.exception;
      if (e is NetworkImageLoadException) {
        debugPrint('Ignoring expected network error: $e');
        return;
      }
      originalOnError(data);
    };
  }

当这返回 Future 时,我需要

await appHelper.ignoreNetworkImageLoadException();

在我的测试中。

© www.soinside.com 2019 - 2024. All rights reserved.