javascript – 量角器:我是否过度使用promise.then()

前端之家收集整理的这篇文章主要介绍了javascript – 量角器:我是否过度使用promise.then()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用Protractor进行端到端测试.我正在处理的应用程序的一部分首先使用ng-switch语句在注册过程中显示/隐藏问题,一次一个.问题之间有动画给了我最难的时间.例如,尝试加载页面 – >转到下一个问题 – >断言元素存在是很困难的.该脚本将加载页面,单击下一个按钮,然后在屏幕上显示下一张幻灯片之前进行断言.

更糟糕的是,在问题之间大约半秒钟,旧问题和新问题都存在于DOM上.我能想到的最好的非睡眠等待机制是做一个browser.wait(),它首先等待DOM上有两个问题,然后链接另一个browser.wait()等待那里只有一个再次询问DOM,然后从那里开始. (整个操作包含在代码中的registerPage.waitForTransition()中)

browser.wait()s并不总是阻塞足够长的时间,所以我最终编写了如下所示的代码

it('moves to prevIoUs question after clicking prevIoUs link',function() {
    var title;

    // Get the current slide title,then click prevIoUs,wait for transition,// then check the title again to make sure it changed

    registerPage.slideTitle.getText()
        .then(function(text) {
            title = text;
        })
        .then(registerPage.prevLink.click())
        .then(registerPage.waitForTransition())
        .then(function() {
            expect(registerPage.slideTitle.getText()).not.toBe(title);
        });
});

为了确保在执行下一个命令之前正确完成每个等待.现在这完美无缺.之前发生的事情是,测试将在95%的时间内成功,但在转换实际上已完成100%之前,偶尔会触发断言或下一次点击操作等.这种情况不再发生了,但我觉得这几乎是在承诺上过度使用.then().但与此同时,迫使一切顺序发生是有道理的,因为这与网站的交互实际上是如何运作的.加载页面,然后等待下一个按钮滑入,然后进行选择,然后单击下一个按钮,然后等待下一张幻灯片等.

我是在一个完全糟糕的练习风格中这样做的,还是在一个动画效率很高的应用上使用Protractor时这是否可以接受使用承诺?

最佳答案
我喜欢这类代码审查问题,所以感谢发帖.

我认为你的一些.thens是不必要的. .click()和期望不应该需要它们,因为它们应该被添加controlFlow中.期望也应该处理你的getText()的承诺.

你遇到的问题似乎是在waitForTransition()方法中,在controlFlow之外运行.根据您在此方法中处理等待的方式,您可能需要自己将其添加到controlFlow.例如.你在调用非webdriver命令吗?在这样的情况下使用Expected Conditions isClickable()我也有好运.

此外,我还会将大部分代码卸载到您的页面对象中,尤其是在需要等待时.例如,如果您向页面对象添加以下内容

registerPage:

this.getSlideTitleText = function() {
    return this.slideTitle.getText().then(function(text) {
        return text;
    });
};

this.clickPrevLink = function() {
    this.prevLink.click();
    return this.waitForTransition(); // fix this and the rest should work
};

那你的测试可能是……

it('moves to prevIoUs question after clicking prevIoUs link',function() {
    var title = registerPage.getSlideTitleText();
    registerPage.clickPrevLink();

    expect(registerPage.getSlideTitleText()).not.toBe(title);
});

猜你在找的JavaScript相关文章