#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');