【问题标题】:Flutter: How to implement FlutterError.OnError correctlyFlutter:如何正确实现 FlutterError.OnError
【发布时间】:2019-06-15 02:52:33
【问题描述】:

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

我在网上看到 sn-ps 提到了这一点,但我所有的实现都失败了

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'
...

我读到您可以执行以下 sn-p 之类的操作,但它没有看到如何/在何处实现它:

final errorHandled = expectAsync0((){});

FlutterError.onError = (errorDetails) {
  // handle error
  errorHandled();
});

【问题讨论】:

    标签: dart flutter flutter-test


    【解决方案1】:

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

    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
      }
    }
    

    【讨论】:

    • 最初的问题更多是关于小部件测试和自定义错误,而不是从源代码记录错误。由于expect 不起作用并且FlutterError.onError 建议与expectAsync0 一起使用,因此答案应与在小部件单元测试中测试自定义错误的方式一致。
    【解决方案2】:

    这是为测试而设计的。我切换到在 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);
    

    【讨论】:

    • 因此,如果我理解正确,您在应用程序中管理了异常并停止尝试在测试中捕获它。是这样吗?
    • 是的,这是正确的。我正在检查我的自定义异常的“行为”或“工件”,而不是异常本身
    • 好的。我很想知道您在问题中解释的问题是否真的有解决方案,或者是否唯一的方法是通过解决方法。我的情况非常相似,不想通过捕获它来释放异常。
    猜你喜欢
    • 1970-01-01
    • 2023-02-04
    • 2020-06-27
    • 2021-07-21
    • 2018-08-04
    • 2020-08-10
    • 1970-01-01
    • 2015-02-27
    • 2013-07-22
    相关资源
    最近更新 更多