Тестирование на флаттер WillPopScope с кнопкой возврата

#flutter #testing #flutter-test

#трепетание #тестирование #тест на флаттер

Вопрос:

В моем домашнем виджете, когда пользователь нажимает кнопку возврата к системе, он показывает с помощью WillPopScope виджет диалогового окна подтверждения. Я хочу протестировать этот диалог, но я не могу понять, как нажать кнопку «Назад» в тестовом файле.

Ответ №1:

У меня была та же проблема, но в моем приложении не было кнопки возврата. Я хотел протестировать кнопку возврата системы Android. Вот как я это сделал. Может быть, это полезно для людей, которые сталкиваются с той же проблемой, что и я.

 testWidgets("test onWillPop",(WidgetTester tester) async {
    bool willPopCalled = false;
    await tester.pumpWidget(
      MaterialApp(
        home: Scaffold(
          body: WillPopScope(
            onWillPop: () async {
              willPopCalled = true;
              return false;
            },
            child: Container(),
          ),
        ),
      ),
    );

    final dynamic widgetsAppState = tester.state(find.byType(WidgetsApp));
    await widgetsAppState.didPopRoute();
    await tester.pump();

    expect(willPopCalled, true);
});
 

Вдохновленный: https://github.com/flutter/flutter/blob/master/packages/flutter/test/material/will_pop_test.dart

Комментарии:

1. Почему бы не проверить и это expect(await widgetsAppState.didPopRoute(), isTrue); тоже?

2. Это дело личных предпочтений, лично я никогда не тестирую функциональность самого фреймворка Flutter. Фрагмент кода, который я написал, является лишь примером того, как вы можете вызвать кнопку «Назад». В обычных случаях ваш виджет определен в исходном проекте, и вы ожидаете, что что-то произойдет при нажатии кнопки «Назад». Я бы только утверждал предполагаемый результат.

Ответ №2:

Я не могу понять, как нажать кнопку «Назад» в тестовом файле.

Это поможет вам увидеть кнопку «Назад» на панели приложений (верхняя часть приложения). Это позволит вам увидеть кнопку «Назад» через панель приложений

 return WillPopScope(
  onWillPop: _onWillPop,
  child: Scaffold(
    appBar: AppBar(
      title: Text("Title"),
      centerTitle: true,
      leading: IconButton(
        icon: Icon(Icons.arrow_back, color: Colors.black),
        onPressed: () => _onWillPop(),
      ),
    ),
    body: Body(),
  ),
);
 

_onWillPop будет вашим «виджетом диалогового окна подтверждения» для вашего вопроса.

Ответ №3:

По-видимому, вы не можете получить доступ Navigator к тесту. Итак, мое решение состоит в том, чтобы включить BackButton где-нибудь в закачанный виджет и открыть страницу следующим образом:

 await tester.pumpWidget(MaterialApp(
  home: Scaffold(
    body: Container(
      child: BackButton(),
    ),
  ),
));

...

await tester.pageBack();