Драйвер флаттера, как ожидать, чтобы указанный элемент c имел указанный текст c - PullRequest
0 голосов
/ 20 марта 2020

Я испытываю слабость в своих тестах на флаттер.

Следующий код:

    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.!'))

Тем не менее, я не хочу просто найти какой-либо текст на экране, я хочу исследовать конкретно имя-ошибки, поскольку на том же экране также есть ошибка фамилии.

1 Ответ

0 голосов
/ 20 марта 2020

Тесты драйвера Flutter по умолчанию синхронизированы по кадрам. ie, он будет ждать, пока нет ожидающих кадров. Поскольку вы говорите драйверу подождать до 17 мс, он может не обязательно ждать до этого времени, пока не будет выполнено условие ожидающего кадра, и, таким образом, как только драйвер завершит ожидание в течение 17 мс, он попытается выполнить следующий оператор, который может быть активный / видимый для него. Следовательно, вы можете видеть вялость. Чтобы избежать этого, вы можете захотеть обернуть свой код в метод runUnsynchronized(), который поможет продолжить действие с отключенной синхронизацией кадров c. Вы можете прочитать больше об этом методе здесь .

Надеюсь, это поможет.

...