【问题标题】:Do I need to check for promises before an expect check with Protractor and AngularJS?在使用 Protractor 和 AngularJS 进行期望检查之前,我是否需要检查承诺?
【发布时间】:2014-09-08 13:01:48
【问题描述】:

我的测试代码如下所示:

pageLogin(userName: string, password: string) {
    element(by.id('loginUserName')).clear();
    element(by.id('loginPassword')).clear();
    element(by.id('loginUserName')).sendKeys(userName);
    element(by.id('loginPassword')).sendKeys(password);
    element(by.id('loginButton')).click();
    expect(element(by.id('ngApp')).isPresent()).toBe(true);
}

谁能给我解释一下。我是否需要在期望之前等待从函数的前五行返回承诺?这个函数里面的行是异步执行的吗?

【问题讨论】:

  • 这是 Javascript 吗? pageLogin(userName: string, password: string) { 是在 it() Jasmine 规范中完成的 pageLogin() 调用吗?

标签: angularjs protractor


【解决方案1】:

Protractor 使用称为control flows 的方法让您以一种看起来同步的方式编写测试。实际发生的情况是,您在函数内部进行的调用会排队等候,并且仅在函数返回时才开始执行。

所以当你的函数完成运行时,量角器会查看队列并执行第一项,即element(by.id('loginUserName')).clear() 语句。当浏览器清除 loginUserName 文本框后,它会向量角器发出信号,量角器会去执行队列中的下一项。

在您的示例中,element(by.id('ngApp')).isPresent() 将是队列中的最后一项。此调用还返回一个承诺,该承诺将在此项目从队列中删除、执行并返回一个值后解决。

Jasmine 的expect() 函数进行了调整,因此它不是同步检查值,而是注意到您传入了一个承诺,因此它在检查期望之前等待该承诺解决。

最后,一旦队列中的所有项目都已执行,量角器将完成运行文本并移动到下一个。

【讨论】:

  • 是的,我知道 .isPresent() 返回一个承诺。但是上面的行呢?
  • 感谢您的详细回答。我有另一个与此相关的问题,但更深入一点。与其在这个问题上问更多,我会提出另一个问题来问这个问题。
  • 这里是另一个开放赏金为 500 的问题的链接:stackoverflow.com/questions/25689090/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2020-08-14
  • 1970-01-01
  • 2014-11-24
  • 2021-09-21
  • 2012-10-18
相关资源
最近更新 更多