【问题标题】:How to validate a value before and after a promise is resolved?如何在 promise 解决之前和之后验证值?
【发布时间】:2016-05-05 04:32:30
【问题描述】:

我正在使用 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 后端调用中构建人为延迟时起作用,否则该过程显然太快并且值将显示“成功”。

【问题讨论】:

  • UI 端是否有任何迹象表明status 发生了变化?
  • @alecxe 是的,UI 正确显示了我想要的 status 更改。我似乎无法在自动化测试中捕获它们。
  • 知道了。是否有一个带有状态文本的元素或一个加载微调器,我们可以检查而不是访问控制器中的字段?谢谢。
  • 当然,状态只是绑定到这样的 div:<div>{{vm.status}}</div>,我使用 element(by.binding("vm.status")) 在量角器中访问它,这给了我正确的元素。

标签: javascript angularjs promise protractor


【解决方案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 评论编辑了有关投票的信息

【讨论】:

  • 其实,there is no explicit "poll frequency" for the browser.wait()。但我理解你的想法,我想知道这是否会可靠地工作。谢谢。
  • 有趣,我想知道 500 毫秒的信息来自哪里:)。我一直认为它是 500 毫秒,但我只是对其进行了测试,并且 browser.wait() 确实很少轮询:23:15:18.976 信息 - 执行:[获取当前 url]) 23:15:18.990 信息 - 完成:[获取当前 url ] 23:15:18.997 信息 - 执行:[获取当前 url]) 23:15:19.006 信息 - 完成:[获取当前 url] 23:15:19.028 信息 - 执行:[获取当前 url]) 23:15:19.044信息 - 完成:[获取当前 url] 23:15:19.074 信息 - 执行:[获取当前 url]) 23:15:20.384 信息 - 完成:[获取当前 url]
  • 是的,500 毫秒是其他 selenium 语言绑定(如 Python 或 Java)中的默认轮询频率,尽管它可以在那里进行配置。
  • 我将在下周一在实际代码库上对此进行测试,但我怀疑轮询间隔太长而无法捕获第一个“调用”状态。 API 调用返回非常快...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2018-05-22
  • 2020-12-27
  • 1970-01-01
  • 2019-05-28
  • 2016-10-14
相关资源
最近更新 更多