如何验证promise之前和之后的值?

时间:2016-05-04 17:45:03

标签: javascript angularjs promise protractor

我正在使用Protractor为Angular 1.5应用程序创建端到端测试。该应用程序允许用户通过使用标准input type="file"控件和submit按钮选择文件,将文件上载到后端Web API。我有一个基本上像这样的控制器:

function exampleController() {
    var vm = this;

    vm.status = "";
    vm.buttonClickHandler = buttonClickHandler;

    function buttonClickHandler() {
        vm.status = "calling";
        service.makeAsyncCall()
               .then(function() {
                   vm.status = "success";
               }, function() {
                   vm.status = "error";
               });
    }
}

当用户点击buttonClickHandler按钮时,系统会调用submit

如何使用Protractor编写端到端测试,以验证当用户单击按钮时状态更改为“调用”,然后在promise解析时更改为“成功”?

在我的大多数尝试中,我都可以验证vm.status已设置为“成功”,如果我设置{{{},我可以验证它是否设置为“调用” 1}},但后者 only 在我的Web API后端调用中构建一个人工延迟时起作用,否则该过程显然太快而且值会显示“成功”。

1 个答案:

答案 0 :(得分:1)

这是相当丑陋,片状,这是一个不好的做法,但无论如何我都会尝试:)

it('click test', function () {
    $('button').click();

    browser.wait(function () {
        // Polls 'as fast as possible' until it evalutes to truthy value
        // This might be flaky if 'calling' status is shorter than
        // 1 polling interval (whose length can't be determined)
        return $('div_containing_status').getText().then(function (status) {
            return /calling/.test(status);
        });
    }, 10000);

    expect($('div_containing_status').getText()).toBe('calling');

    browser.wait(function () {
        return $('div_containing_status').getText().then(function (status) {
            return /success/.test(status);
        });
    }, 10000);

    expect($('div_containing_status').getText()).toBe('success');
});

更新:根据@alecxe评论修改了有关投票的信息