如何使EXPECT条件等待promise被解析(代码包装在一个方法中)?

时间:2016-03-30 21:23:04

标签: javascript node.js jasmine protractor

当我尝试在测试体中使用以下代码片段时,似乎工作正常,除了这个块之后(外部)的代码仍在执行并且最后测试失败的事实。

var el = element(by.model('name.first'));
    el.isDisplayed().then(function(condition) {
        console.log("Is Element Displayed : " + condition);
        if(!condition) {
            fail('Test Failed');
        }
    });

但是当我将这段代码包装在一个方法(在其他一些util文件中)时,如:

isMyElementDisplayed: function (element) {
    var el = element;
    el.isDisplayed().then(function(condition) {
        console.log("Is Element Displayed : " + condition);
        return condition;
    });
}

然后尝试在我的测试中调用此方法,如:

expect(elementActions.isMyElementDisplayed(element(by.model('name.first')))).toBe(true);

它失败并出现以下异常。

Expected undefined to be true.

但是我看到消息在日志中打印出来: Is Element Displayed : false

并且在这种情况下,测试也不会停留在'期望'状态,但最终会失败。你可以说我是新手量角器和javascript。我正在尝试自动化QA功能测试并构建一些可重复使用的方法,这些方法可以再次使用,也可以由其他人使用。

  1. 是否有正确的方法将代码包装在我正在做的util方法中?以及

  2. 如何让expect条件等到承诺得到解决?

  3. 仅供参考:npm -version - > 2.14.7和量角器 - 版本 - > 3.0.0

1 个答案:

答案 0 :(得分:2)

@Artyom指出将return放入isMyElementDisplayed函数:

isMyElementDisplayed: function (element) {
    var el = element;

    // v HERE
    return el.isDisplayed().then(function(condition) {
        console.log("Is Element Displayed : " + condition);
        return condition;
    });
}

这样isMyElementDisplayed函数将返回一个将被置于控制流上的promise,expect将在进行断言之前隐式解析它。

虽然,我会使用等待来处理问题:

var EC = protractor.ExpectedConditions;

var elm = element(by.model('name.first'));
browser.wait(EC.visibilityOf(elm), 5000, "Element is still not visible");

expect(elm.isDisplayed()).toBe(true);