如何解决Flutter 集成测试 - 状态不佳,无元素
在我的集成测试中,我必须继续执行:await tester.pumpAndSettle(const Duration(seconds: [some duration]));
以等待小部件在动画延迟后加载到屏幕上,否则我会收到错误:“状态不佳:没有元素”。
这是处理这个问题的最佳方式吗?我发现现在我正在尝试向我的持续集成平台添加集成测试非常不稳定。我不得不增加更多的等待时间,这感觉很糟糕(竞争条件),并且由于构建时间更长,还会增加持续集成的成本。下面是代码示例:
Future<void> registerUserPasswordButtonShouldBeDisabled() async {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('''registering a new user with non-unique email address disables
register password button''',(WidgetTester tester) async {
await app.main();
await tester.pumpAndSettle(const Duration(seconds: 5));
final registerButton = find.byKey(const Key('register'));
是否有更好的方法来处理由于延迟动画导致小部件直到一些延迟才出现在屏幕上的“不良状态:无元素”错误?
解决方法
您是否尝试过不使用持续时间参数?
await tester.pumpAndSettle();
如果你有一个动画加载微调器和一些在你的按钮显示之前的过渡,那么 pumpAndSettle
将等到所有这些动画都停止并且不会比默认的 100 毫秒长一毫秒,这不是很大的浪费时间。
参考:the docs
,我遇到了同样的问题,并为 waitFor
编写了一个小的替代品:
Future<void> waitFor(Finder finder,[timeoutInSeconds = 10]) {
Completer c = Completer();
Timer poll;
Timer timeout;
poll = Timer.periodic(Duration(milliseconds: 500),(_) {
if (finder.evaluate().isNotEmpty) {
poll.cancel();
timeout.cancel();
c.complete();
}
});
timeout = Timer(Duration(seconds: timeoutInSeconds),() {
poll.cancel();
c.completeError('WaitFor timed out for ${finder.description}');
});
return c.future;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。