Flutter: как правильно реализовать FlutterError.OnError - PullRequest
0 голосов
/ 21 января 2019

Может кто-нибудь показать мне, как реализовать переопределение ошибок трепетания во время теста виджета, чтобы я мог проверить свои собственные пользовательские ошибки.

Я видел фрагменты онлайн, упоминающие об этом, но все мои реализации терпят неудачу

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();
});

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Я использую код, приведенный ниже, для регистрации ошибок на сервере.

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
  }
}
0 голосов
/ 21 января 2019

Это был дизайн для теста. Я переключился на логику обтекания в try / catch, затем запустил ожидаемую () концепцию «текст сообщения об ошибке». например:

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);
...