如何让量角器等待触发的承诺解决?

时间:2014-11-07 16:18:12

标签: javascript angularjs protractor angular-promise

所以我有一个网站,点击一个按钮,它发送到一个角度服务,它提出一个承诺,解决它,获取一些数据,并在页面上显示该数据。我想要一个角度测试,找到按钮,点击它,并验证我得到了数据。但是,测试总是在按钮结算之前完成。我尝试了browser.sleep(),但这只是暂停了承诺从未解决的事情。关于量角器的许多其他与承诺相关的问题没有帮助,因为承诺没有在测试中设置,而是由页面本身设置。

这是我的测试:

it('should roll a d2', function () {
    element(by.id('d2Button')).click();

    //whatever has to be here for the waiting to occur

    expect(element(by.binding('rolls.d2')).getText()).not.toEqual('0');
});

这是HTML:

<button id="d2Button" type="button" class="btn btn-success" ng-click="rollD2()">Roll</button>
<span><b>{{rolls.d2 | number}}</b></span>

以下是点击时调用的角度代码的简短摘要:

$scope.rollD2 = function () {
    diceService.getD2Roll($scope.quantities.d2).then(function (data) {
        $scope.rolls.d2 = data.roll;
    });
};

这是服务电话:

function getD2Roll(quantity) {
    var url = "Dice/D2/" + quantity;
    return getPromise(url);
}

function getPromise(url) {
    var deferred = $q.defer();
    $http.get(url).success(deferred.resolve).error(deferred.reject);
    return deferred.promise;
}

如何让测试正确等待?

1 个答案:

答案 0 :(得分:6)

这里的答案是在按钮点击后使用内置的browser.waitForAngular()功能。我为所有使用的测试做了一个通用的方法,如下所示:

app.clickButtonAndWaitForResolution = function (button) {
    button.click();
    browser.waitForAngular();
};

然后,任何需要单击触发AJAX调用的按钮的测试都将调用此函数并传入要单击的按钮元素。