Flutter 颤振集成测试-不良状态,无元件

Flutter 颤振集成测试-不良状态,无元件,flutter,integration-testing,flutter-test,Flutter,Integration Testing,Flutter Test,在我的集成测试中,我必须继续这样做:wait tester.pumpAndSettle(const Duration(seconds:[some Duration])等待小部件在动画延迟后加载到屏幕上,否则会出现错误:“坏状态:无元素” 这是处理这个问题的最好办法吗?我发现现在我正试图将集成测试添加到我的持续集成平台中,这是非常脆弱的。我不得不在等待时间上增加更多的时间,这让我感觉很不舒服(比赛条件),而且由于构建时间更长,还会增加持续集成的成本。下面是一个代码示例: Future<voi

在我的集成测试中,我必须继续这样做:
wait 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'));
Future registerUserPasswordButtonShouldBeDisabled()异步{
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets(“”)使用非唯一电子邮件地址注册新用户将禁用
注册密码按钮“”,(WidgetTester测试仪)异步{
等待app.main();
等待测试仪泵送和沉降(持续时间(秒:5));
最终寄存器按钮=find.byKey(常量键(“寄存器”);

是否有更好的方法来处理由于延迟动画导致窗口小部件在延迟之前不会出现在屏幕上而导致的“错误状态:无元素”错误?

您是否尝试过不使用持续时间参数

await tester.pumpAndSettle();
如果在显示按钮之前有一个动画加载微调器和一些过渡,则
pumpandsolite
将等待所有这些动画停止,并且不会比默认的100ms长一毫秒,这不是一个很大的时间浪费


参考资料:

我也遇到了同样的问题,并为
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;
}
Future waitFor(查找器,[timeoutingseconds=10]){
完成符c=完成符();
定时器轮询;
定时器超时;
轮询=计时器。周期性(持续时间(毫秒:500),(u){
if(finder.evaluate().isNotEmpty){
poll.cancel();
超时。取消();
c、 完全();
}
});
超时=计时器(持续时间(秒:TimeOutingSeconds),(){
poll.cancel();
c、 completeError(${finder.description}的WaitFor超时);
});
返回c.未来;
}

是的,我一开始确实尝试过,但等待的时间不够长。这可能是因为我的动画在开始制作动画之前有很长的延迟,所以它们根本不存在。可能有很多原因让你不想或不能,但可能会更早开始制作动画?这是一个非常好的问题,我希望从t那里看到更好的答案他喜欢社区。