Доступ к GetXController в тесте виджета Flutter

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

Мы изучаем GetX, и нам нужно проверить это поведение в тесте виджетов. Экран входа в систему - это виджет без сохранения состояния, который загружает GetXControllerподкласс называется зависимостью. Этот класс контроллера содержит наблюдаемое логическое значение, называемое canCheckBiometrics, имеет сеттер, называемый setBiometrics(bool newValue)и используется для определения наличия переключателя управления. Виджет без сохранения состояния LoginView проверяет наличие биометрических данных с помощью local_authpackage и соответственно вызывает setBiometrics. Отрывок кода из LoginView:

        final controller = Get.put(LoginViewController());

  Future<void> _checkForBiometrics() async {
    bool enabled = await localAuth.canCheckBiometrics;
    controller.setBiometrics(enabled);
  }

Я бы хотел поиздеваться над LoginViewController класс в моем тесте виджетов и вызовите setBiometricsпо мере необходимости для выполнения тестов. Ниже приведен раздел моего теста виджетов:

      class MockLoginViewController extends Mock implements LoginViewController {}

void main(){

  final controller = MockLoginViewController();

  setUp(() { });
  tearDown(() { });

  group('Controls are present and functioning', () {

    // ... other tests

  testWidgets('Biometrics switcher present conditionally', (tester) async {
    await tester.pumpWidget(const _LoginWrapper());
    var biometricsSwitch = find.byKey(UIKeys.keySwitchBiometrics);
    // if controller.canCheckBiometrics.value is true
    // controller.setBiometrics(true);
    // expect(biometricsSwitch, findsOneWidget);
    // if controller.canCheckBiometrics.value is false
    // controller.setBiometrics(false);
    // expect(biometricsSwitch, findsNothing);
  });

class _LoginWrapper extends StatelessWidget {
  const _LoginWrapper({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: LoginView());
  }
}

В LoginView должен быть завернут в MaterialApp избегать MediaQuery ошибки.

У меня вопрос: как связать MockLoginViewControllerс тестируемым виджетом, чтобы я мог переключать значение и проверять наличие переключателя? Или я все неправильно делаю?

ПРИМЕЧАНИЕ: я попытался попробовать get_test package, чтобы помочь с этим, но он не поддерживает нулевую безопасность и поэтому бесполезен.

0 ответов

Другие вопросы по тегам