Jasmine异步测试问题

时间:2017-02-07 13:37:57

标签: javascript testing jasmine protractor angularjs-e2e

我在使用量角器编写的最终2端测试中使用Jasmine。我正在尝试创建页面对象抽象,以用作我的解决方案中定义的其他页面对象的基类。

由于我的应用程序是基于经典表单的解决方案,因此我可以将编辑页面的常见行为收集到基类中。为了更接近M **模式 - 我想将我的抽象视图与具体模型联系起来。

所以我的基页对象视图如下:

export class EditPageBase<T> {
   constructor(T model) {
      this.model = model;
   }

   fillForm() {
      ...
   }

   checkForm() {
      ...
   }
}

其中T级模型与此视图相关。

这种方法允许我使用模型结构并直接映射到我的视图。因此,在我看来,模型中定义的任何属性都有对应的表示。

所以我可以使用下一个语法来映射我的模型来查看:

for(let prop in this.model) {
   let ctrl = this.getControl(prop);
   ctrl.sendKeys(this.model[prop]);
}

因此,形式复杂程度并不重要 - 我只需要正确定义我的模型。

我在检查表单数据作为量角器时遇到的问题在请求页面数据时返回promise:

for(let prop in this.model) {
  let ctrl = this.getControl(prop);
  expect(ctrl.getAttribute('value')).toEqual(this.model[prop] || '');
}

此代码不时抛出:

  

茉莉花规格超时。重置WebDriver控制流程。

     

错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调。

我知道为什么会发生这种情况 - 因为我的循环可以更早地结束承诺将解决。我不知道如何处理这种情况。我不想创建promises链或其他Promise.all包装器,因为Jasmine适用于promises,所以想在这里保持代码清洁。

也许以前有人遇到过这个问题,并且可以分享一些如何使用Jasmine电源的想法,而不是转向承诺地狱。

1 个答案:

答案 0 :(得分:0)

您可以将done回调传递给Jasmine中的it方法,并且在测试中,异步工作完成后,您可以调用此done函数向Jasmine发送信号您的异步代码已完成,例如:

it('does something', function(done) {
    someAsyncMethod().then(function() {
        expect(true).toEqual(true);
        done(); // signal to Jasmine async operation is complete
    }
});

有关详细信息,请参阅Jasmine docs

相关问题