Javascript 如何在承诺解决前后验证值?
我正在使用量角器为Angular 1.5应用程序创建端到端测试。应用程序允许用户通过使用标准Javascript 如何在承诺解决前后验证值?,javascript,angularjs,promise,protractor,Javascript,Angularjs,Promise,Protractor,我正在使用量角器为Angular 1.5应用程序创建端到端测试。应用程序允许用户通过使用标准input type=“file”控件和submit按钮选择文件,将文件上载到后端Web API。我有一个控制器,其基本行为如下: function exampleController() { var vm = this; vm.status = ""; vm.buttonClickHandler = buttonClickHandler; function butto
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
按钮时,将调用按钮ClickHandler
如何使用量角器编写端到端测试,以验证当用户单击按钮时状态是否更改为“调用”,然后在承诺解决时状态是否更改为“成功”
在我的大多数尝试中,我可以验证
vm.status
是否已设置为“success”、或如果我设置ignoreSynchronization=true
,我可以验证它是否设置为“calling”,但后者只有在我在Web API后端调用中构建人工延迟时才起作用,否则,这个过程显然太快了,值会显示“成功”。这是一个相当丑陋、不可靠的做法,但我还是会尝试一下:)
更新:根据@alecxe comment编辑的轮询信息UI端是否有任何指示显示
状态
更改?@alecxe是的,UI正确显示了我想要的状态
更改。我似乎无法在自动测试中捕获它们,明白了。是否有一个带有状态文本或加载微调器的元素,我们可以检查它,而不是访问控制器中的字段?谢谢。当然,状态只是绑定到一个div,如:{{vm.status}
,我在量角器中使用元素(by.binding(“vm.status”)
访问它,它给出了正确的元素。实际上。但我理解你的想法,我想知道这是否能可靠地工作。谢谢。很有趣,我想知道500毫秒的信息来自哪里:)。我一直认为它是500毫秒,但我只是测试了它和浏览器。wait()确实很少轮询:23:15:18.976 INFO-Executing:[获取当前url])23:15:18.990 INFO-Done:[获取当前url]23:15:18.997 INFO-Executing:[获取当前url]23:15:19.006 INFO-Done:[获取当前url]23:15:19.028 INFO-Executing:[获取当前url])23:15:19.044 INFO-Done:[获取当前url]23:15:19.074 INFO-Executing:[获取当前url])23:15:20.384 INFO-Done:[获取当前url]是的,500毫秒是其他selenium语言绑定(如Python或Java)中的默认轮询频率,尽管在那里是可配置的。我将在下周一的实际代码库中测试这一点,但我怀疑轮询间隔太长,无法捕获第一个“呼叫”状态。API调用返回得非常快。。。
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');
});