Юнит-тестирование void-функции с функцией showDialog и параметром BuildContext - PullRequest
0 голосов
/ 10 октября 2019

Я пишу unittest для функции showAlertDialog(), которая показывает диалоговое окно с коротким сообщением и кнопкой ОК.

Функция выглядит следующим образом

import 'package:flutter/material.dart';

void showAlertDialog(BuildContext context) {
  Widget okButton = FlatButton(
    child: Text("OK"),
    onPressed: () {
      Navigator.of(context).pop(); // Closes alert
      Navigator.of(context).pop(); // Closes drawer
    },
  );

  AlertDialog alert = AlertDialog(
    title: Text("Success", style: TextStyle(color: Colors.green)),
    content: Text("API key has beed updated succesfully."),
    actions: [
      okButton,
    ],
  );

  showDialog(
    context: context,
    builder: (BuildContext context) => alert,
  );
}

Использование документации Flutter Я пытался использовать класс testWidget, чтобы проверить, правильно ли создается виджет оповещения следующим образом:

main() {
  testWidgets('Show code 200', (WidgetTester tester) async {
    await tester.pumpWidget(Builder(builder: (BuildContext context) {
      return showAlertDialog(context);
    }));
    final titleFinder = find.text('Success');
    final messageFinder = find.text('API key has beed updated succesfully.');
    expect(titleFinder, findsOneWidget);
    expect(messageFinder, findsOneWidget);
  });
}

Но это не скомпилируется из-за error: The return type 'void' isn't a 'Widget', as defined by anonymous closure. (return_of_invalid_type_from_closure at [app] test\alert_dialog_test.dart:8).

Когда я удаляю оператор void из объявления showAlertDialog, он будет скомпилирован, но произойдет сбой со следующей ошибкой:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building Builder(dirty):
No MaterialLocalizations found.
Builder widgets require MaterialLocalizations to be provided by a Localizations widget ancestor.
Localizations are used to generate many different messages, labels,and abbreviations which are used
by the material library.
To introduce a MaterialLocalizations, either use a  MaterialApp at the root of your application to
include them automatically, or add a Localization widget with a MaterialLocalizations delegate.
The specific widget that could not find a MaterialLocalizations ancestor was:
  Builder
The ancestors of this widget were:
  [root]

Как правильно выполнить модульное тестирование этой функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...