我在使用量角器编写的最终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电源的想法,而不是转向承诺地狱。
答案 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