Интеграционное тестирование с использованием драйвера Flutter для виджета TextField в flutter

#flutter #dart #integration-testing #flutter-test #flutterdriver

Вопрос:

Я пытаюсь провести интеграционное тестирование с помощью драйвера flutter. Я использую драйвер await.enterText(найти.byType(‘Поле ввода текста’)) для ввода otp с помощью драйвера flutter. Но он застрял на этом экране и ничего не делает, и тест завершается ошибкой после завершения. Виджет «Текстовое поле» имеет пользовательский интерфейс, отличный от обычного текстового поля. Я не уверен, будет ли функция enterText работать в этом или нет. Если нет, то каковы некоторые альтернативы?

Вот мой код для виджета текстового поля:

 OTPTextField(
                key: const Key('otpvalue'),
                length: 6,
                textFieldAlignment: MainAxisAlignment.spaceAround,
                fieldWidth: 30,
                fieldStyle: FieldStyle.underline,
                width: MediaQuery.of(context).size.width / 2,
                style: TextStyle(
                    fontSize: 17,
                    color: Colors.black,
                    fontWeight: FontWeight.bold),
                onCompleted: (pin) async {
                  print("Completed: "   pin);
                  print(_user.status);
                  if (_user.status == Status.VerifyingOTP ||
                      _user.status == Status.VerifiedOTP) {
                    Navigator.of(context).push(
                        MaterialPageRoute(builder: (_) => LoaderScreen()));
                      return;
                  }
                  if (widget.isSignup) {
                    if (await _user.signUpWithPhoneNumber(
                      pin.toString(),
                      context,
                      email: widget.emailId,
                      firstName: widget.firstName,
                      lastName: widget.lastName,
                    )) {
                      Navigator.of(context).pushReplacement(
                          MaterialPageRoute(
                              builder: (context) => OtpVerified()));
                    } else {
                      Navigator.of(context).push(
                          MaterialPageRoute(
                              builder: (context) => LoaderScreen()));
                    }
                  } else {
                    if (await _user.signInWithPhoneNumber(
                        pin.toString(), context, _user.language, _user.country)) {
                      Navigator.of(context).pushReplacement(
                          MaterialPageRoute(
                              builder: (context) => OtpVerified()));
                    } else {
                      Navigator.of(context).push(
                          MaterialPageRoute(
                              builder: (context) => LoaderScreen()));
                    }
                  }
                },
              ),
 

А вот код для интеграционного тестирования, который я попробовал для этого виджета.

 test('enter otp', () async {
 SerializableFinder enterotp = find.byValueKey('otpvalue');
  await driver.tap(enterotp);
  await driver.enterText('123456');
  expect(await driver.getText(enterotp), "123456");
});
 

Ответ №1:

Возможно, происходит какая-то анимация и драйвер блокирует поиск виджета, для этого попробуйте решение 1. Если это не сработало, попробуйте решение 2:

Решение 1:

 test('enter otp', () async {
  await driver.runUnsynchronized(() async {
    SerializableFinder enterotp = find.byValueKey('otpvalue');
    await driver.tap(enterotp);
    await driver.enterText('123456');
    expect(await driver.getText(enterotp), "123456");


});
});
 

Решение 2:

        final otpField = find.descendant(
        of: find.byType('OTPTextField'),
        matching: find.byType('AnimatedContainer'),
       
    );
      await driver.tap(otpField);
      await driver.enterText('111111');