Я испытываю слабость в своих тестах на флаттер.
Следующий код:
await driver.tap(find.byValueKey('first-name-field'));
await driver.enterText('');
await Future.delayed(Duration(milliseconds: 17), () {});
expect(
await driver.getText(find.byValueKey('first-name-error')),
equals('Field can't be empty.'),
);
await driver.enterText('$#@');
await Future.delayed(Duration(milliseconds: 17), () {});
expect(
await driver.getText(find.byValueKey('first-name-error')),
equals('Field contains unsupported characters.'),
);
await driver.enterText('Chris');
await Future.delayed(Duration(milliseconds: 17), () {});
await driver.waitForAbsent('first-name-error');
Вероятность успеха составляет около 90%, однако я ожидаю 10% случаев " Поле содержит неподдерживаемые символы. ", Но у меня все еще есть" Поле не может быть пустым ".
Как работает код - слушатель TextEditingController сообщает об изменении ViewModel. ViewModel имеет поток, который выдает ошибку в виде строки или нуля, View использует StreamBuilder для отображения метки ошибки или ее скрытия.
Чтобы смягчить эту проблему, я ввел задержку в один кадр (17 миллисекунд) - это немного помогло, но все еще облупился. Я мог бы увеличить задержку, но это связано с затратами на более медленные тесты. Я нашел метод, который должен сделать этот тест лучше:
await driver.waitFor(find.text('Field can't be empty.!'))
Тем не менее, я не хочу просто найти какой-либо текст на экране, я хочу исследовать конкретно имя-ошибки, поскольку на том же экране также есть ошибка фамилии.