【问题标题】:Jasmine async testing issueJasmine 异步测试问题
【发布时间】:2017-02-07 13:37:56
【问题描述】:

我在用量角器编写的端到端测试中使用 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]);
}

所以我的表单有多复杂并不重要——我只需要正确定义我的模型。

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

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

这段代码不时抛出:

Jasmine 规范超时。重置 WebDriver 控制流。

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

我知道为什么会发生这种情况 - 因为我的循环可以提前结束,承诺将解决。我不知道如何处理这种情况。我不想创建 Promise 链或其他 Promise.all 包装器,因为 Jasmine 与 Promise 配合得很好,所以我想在这里保持代码干净。

也许有人以前遇到过这个问题,可以在这里分享一些如何使用茉莉花力量而不是切换到承诺地狱的想法。

【问题讨论】:

    标签: javascript testing jasmine protractor angularjs-e2e


    【解决方案1】:

    您可以将 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了解更多信息

    【讨论】:

    • 感谢您的回复。是的,我知道done,但这不是我需要的。我需要等待循环内的所有承诺而不是在此之前以函数执行结束的问题。即使没有 done 回调,Jasmine 也能很好地处理 promise。
    猜你喜欢
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2013-06-28
    • 2021-01-18
    • 2014-09-23
    相关资源
    最近更新 更多