简介:尝试在Angular 2同步中进行E2E测试
Protractor是Jasmine的包装器,它为E2E测试中的promise提供了一些支持,因此开发人员不必创建大量嵌套的异步回调,async hell。我认为Protractor鼓励开发者让他们的测试同步。
此处的报价:https://blog.liip.ch/archive/2015/01/28/angularjs-end-to-end-testing-with-protractor.html
重要的是要注意Protractor完全是异步的,所以 所有API方法都返回promise。在引擎盖下,量角器使用 Selenium的控制流程(待定承诺的队列)允许我们 以伪同步方式编写测试。量角器很聪明 让它全部工作。
这就是人们对此感到困惑的原因。
因此,在某些情况下,开发人员应该在他们的测试中处理异步方法,例如:我需要获取链接的 href 属性,并检查它的末尾是否有ID,所以我必须定义回调以获取属性的值,解析它并且仅在此检查之后如果它有ID或不存在。
$('a').getAttribute("href").then((url) => {
expect(url.substring(url.lastIndexOf('/'), url.length)).not.toBeNaN();
});
结果,我的测试不再同步和直接了。
问题:我应该将此方法从测试移到Page Object并尝试使其同步吗?
// Page Object
getImageId() {
let attribute = null;
let link = element(by.css('app-image-container .edit-image a'));
link.getAttribute('href').then((data) => { attribute = data; });
browser.wait(() => { return attribute != null; });
return attribute;
}
// Test is synchronous now
expect(page.getImageId()).not.toBeNaN();