Примечание: это для веб-приложения Flutter.
Я тестирую TextField, чтобы показать, что если ввод недействителен, отображается текст ошибки, указанный в InputDecoration.
Виджет работает надлежащим образом, когда я запускаю все приложение и взаимодействую с ним вручную.
Вот определение моего TextField:
TextField(
key: ValueKey('IntSpinner-TEXT'),
controller: _controller,
keyboardType: _keyboardType(),
inputFormatters: widget.inputFormatters ?? [formatter],
decoration: InputDecoration(
border: const OutlineInputBorder(),
errorText: _validInput ? null : 'Invalid input',
),
);
У меня есть слушатель на контроллере TextField, который проверяет новое значение и устанавливает для _validInput значение true или false соответственно.
А вот код моего теста:
testWidgets('should flag invalid values', (WidgetTester tester) async {
int x;
await tester.pumpWidget(MaterialApp(
home: Card(
child: Column(
children: [
IntSpinner( // this widget contains my TextField
key: ValueKey('IntSpinner'),
onChanged: (value) => x = value,
),
],
),
),
));
// Enter valid text
await tester.enterText(find.byKey(ValueKey('IntSpinner-TEXT')), '-2200');
expect(x, equals(-2200));
// Enter invalid text
await tester.enterText(find.byKey(ValueKey('IntSpinner-TEXT')), '2-200');
expect(x, equals(-2200)); // unchanged!!
TextField txt = tester.widget(find.byKey(ValueKey('IntSpinner-TEXT')));
expect(txt.decoration.errorText, equals('Invalid input'));
});
Я получаю такую ошибку:
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
Expected: 'Invalid input'
Actual: <null>
Which: not an <Instance of 'String'>
Я вижу то же самое в отладчике - inputDecoration.errorText имеет значение null. Но когда я запускаю приложение в браузере, я ясно вижу (используя Flutter Widget Inspector), что errorText установлен должным образом (я также вижу, что TextField закрашивается с помощью errorText).
Фрагмент вывода Widget Inspector:
Как правильно проверить TextField.decoration.errorText из теста виджета Flutter?