Angular Chai最终承诺不会在量角器e2e测试中等待太长时间

Angular Chai最终承诺不会在量角器e2e测试中等待太长时间,angular,typescript,protractor,chai,chai-as-promised,Angular,Typescript,Protractor,Chai,Chai As Promised,我正在使用量角器与柴承诺为我的最新Angular 4应用程序。我现在只有2个e2e测试。一个登录现有用户,另一个注册新用户。如果注册成功,我的注册逻辑也将登录新创建的用户 下面是html代码: <ul class="navbar-nav my-2 my-lg-0"> <li *ngIf="!isAuthenticated()" class="nav-item"> <button id="loginLink" class="btn btn-link nav

我正在使用量角器与柴承诺为我的最新Angular 4应用程序。我现在只有2个e2e测试。一个登录现有用户,另一个注册新用户。如果注册成功,我的注册逻辑也将登录新创建的用户

下面是html代码:

<ul class="navbar-nav my-2 my-lg-0">
  <li *ngIf="!isAuthenticated()" class="nav-item">
    <button id="loginLink" class="btn btn-link nav-link" style="line-height: inherit" type="button" role="button" (click)="openLoginModal()">Login</button>
  </li>
  <li *ngIf="!isAuthenticated() && signupAllowed()" class="nav-item">
    <button id="signupLink" class="btn btn-link nav-link" style="line-height: inherit" type="button" role="button" (click)="openSignupModal()">Sign up</button>
  </li>
  <li *ngIf="isAuthenticated()" class="nav-item">
    <a id="logoutLink" class="nav-link" role="button" (click)="logout()">Logout</a>
  </li>
</ul>
正如您所看到的,这两个测试非常相似。但是,
signup/logout
expect(元素(by.id('logoutLink')).isPresent()to.finally.be.true上失败,它也出现在成功的
登录/注销测试中

我错过了什么?感觉它根本就没有等待。但是它适用于
登录/注销
(意味着测试成功)

对API的登录和注册请求都需要大约200毫秒才能完成。重要的是要注意,当用户提交注册表单时,它将首先触发对api的注册请求,如果成功,则触发登录请求。因此,大约需要400毫秒才能完成。我猜,这比
最终将投票/等待的要高

编辑: 一些
expect(…).to.finally
在上面的代码中丢失,我修复了它们。 仅供参考,以下是断言失败:

Auth signup/logout should succeeds with unused username and matching passwords and login:

  AssertionError: expected false to be true
感觉就像承诺在元素实际出现在dom中并使断言失败之前就解决了。而不是再次轮询它,直到它为真或超时

编辑#2: 只是尝试了完全相同的代码,但在执行最后两行之前等待了5秒,它成功通过了

setTimeout(function() {
  expect(element(by.id('logoutLink')).isPresent()).to.eventually.be.true;
  element(by.id('logoutLink')).click();
}, 5000);
所以它肯定是
expect(元素(by.id('logoutLink')).isPresent()).to.finally.be.true承诺将fast解析为false并通过测试。我该如何解决这个问题


任何帮助都将不胜感激。

我不确定这是否是导致此问题的原因,但一旦我将注册代码从:

signup() {
  this.auth.signup(signupData)
      .subscribe({
                   error: (err: any) => {},
                   complete: () => {
                     this.auth.login(new LoginData(signupData.username, signupData.password))
                         .subscribe({
                                      error: (err: any) => {},
                                      complete: () => {
                                        this.activeModal.close();
                                        this.router.navigateByUrl('/');
                                      }
                                    });
                   }
                 });
}
致:

试验成功了。我正在使用AngularJs的original的Angular2+端口

这可能与我如何使用那些auth服务的方法返回的obsertables有关


如果有人能解释,我很高兴能真正理解这里发生的事情。

我不确定这是不是问题导致的,但是,一旦我将注册代码从:

signup() {
  this.auth.signup(signupData)
      .subscribe({
                   error: (err: any) => {},
                   complete: () => {
                     this.auth.login(new LoginData(signupData.username, signupData.password))
                         .subscribe({
                                      error: (err: any) => {},
                                      complete: () => {
                                        this.activeModal.close();
                                        this.router.navigateByUrl('/');
                                      }
                                    });
                   }
                 });
}
致:

试验成功了。我正在使用AngularJs的original的Angular2+端口

这可能与我如何使用那些auth服务的方法返回的obsertables有关

如果有人能解释,我很高兴能真正了解这里发生了什么

signup() {
  this.auth.signup(signupData)
      .subscribe({
                   next: (response) => this.auth.setToken(response.json().token),
                   error: (err: any) => {}, // TODO-jeep87c: Handle 403, 401 with proper UI alert and 500/404 in common handler (use username.setErrors)
                   complete: () => {
                     this.activeModal.close();
                     this.router.navigateByUrl('/');
                   }
                 });
}