我在颤振驱动程序测试中体验到片状。
以下代码:
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 有一个流以字符串或 null 的形式提供错误,View 使用 StreamBuilder 显示或隐藏错误标签。
为了缓解这个问题,我引入了单帧延迟(17 毫秒)——它有点帮助,但仍然不稳定。我可以延长延迟,但这会带来测试速度较慢的成本。我找到了一种可以使这个测试更好的方法:
await driver.waitFor(find.text('Field can't be empty.!'))
但是,我不想只在屏幕上找到任何文本,我想专门检查 first-name-error,因为同一屏幕上还有 last-name-error。