Невозможно смоделировать функцию asyn c, возвращающую Future <bool>Flutter - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь протестировать функцию asyn c, которая вернет Future со значением bool. Но когда код попадает туда, где я издевался над вызовом, я получаю следующую ошибку:

Неудачное утверждение: логическое выражение не должно быть нулевым

Когда было создано исключение, это был стек: # 0 _NavigationControlsState.canGoBack

Есть идеи? Что я здесь делаю не так?

Вот мой код виджета:

class NavigationControls extends StatefulWidget {
  final WebViewController _webViewController;
  final bool _isWebViewReady;

  const NavigationControls(this._webViewController, this._isWebViewReady);

  _NavigationControlsState createState() => _NavigationControlsState();
}

class _NavigationControlsState extends State<NavigationControls> {
  bool _isBackButtonDisabled;

  @override
  void initState() {
    super.initState();
    _isBackButtonDisabled = true;
  }

  canGoBack(WebViewController controller) async {
    await controller.canGoBack()
        ? setState(() => _isBackButtonDisabled = false)
        : setState(() => _isBackButtonDisabled = true);
  }

  @override
  Widget build(BuildContext context) {
    final WebViewController controller = widget._webViewController;
    final isWebViewReady = widget._isWebViewReady;

    if (isWebViewReady) {
      canGoBack(controller);
    }

    return IconButton(
        key: new Key('back'),
        icon: const Icon(Icons.arrow_back_ios),
        onPressed: _isBackButtonDisabled
            ? null
            : () async {
                await controller.goBack();
              });
  }
}

И вот моя тестовая попытка:

class MockWebViewController extends Mock implements WebViewController {}

void main() {
  WebViewController controller;

  setUp(() {
    controller = new MockWebViewController();
  });

  testWidgets('test widget created successfully', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());

    expect(find.byType(WebView), findsOneWidget);
    expect(find.byType(NavigationControls), findsOneWidget);
  });

  testWidgets('test navigation buttons when enabled',
      (WidgetTester tester) async {
    await tester.pumpWidget(NavigationControls(controller, true));

    when(controller.canGoBack()).thenAnswer((_) => Future.value(true));

    await tester.tap(find.byKey(new Key('back')));

    verify(controller.goBack()).called(1);
  });
}

...