如何在解决承诺之前和之后验证值

How to validate a value before and after a promise is resolved?

本文关键字:之后 验证 解决 承诺      更新时间:2023-09-26

我正在使用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";
               });
    }
}

当用户单击submit按钮时,会调用buttonClickHandler

我如何使用Protractor编写端到端测试,以验证当用户单击按钮时状态是否变为"正在调用",然后当承诺解决时状态是否改为"成功"?

在我的大多数尝试中,我可以验证vm.status是否已设置为"成功",如果我设置ignoreSynchronization = true,则我可以验证它是否设置为"调用",但后者仅在我在Web API后端调用中构建人工延迟时才有效,否则进程显然太快,值将显示为"成功(success)"。

这是一个相当丑陋、不稳定的做法,但无论如何我都会尝试一下:)

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评论

编辑了有关轮询的信息