Javascript单元同步测试Promise.all
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript单元同步测试Promise.all,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2467字,纯文字阅读大概需要4分钟。
内容图文
![Javascript单元同步测试Promise.all](/upload/InfoBanner/zyjiaocheng/767/ba9e9296b5594638ad684cf37735a4c0.jpg)
我有一个node.js应用程序,其中我有一个维护状态的对象和一个每30秒更新一次这种状态的更新循环.基本上它是一个构建监视器,它在向前端提供每个管道的最新状态时查询构建机器.
在更新循环中,我需要进行多次调用,为此我需要所有数据来从中进行任何有用的操作.目前我将所有这些调用包装在Promise中并使用Promise.all等待它们全部完成.
在测试中,我与sinon-stub-promise包同步解析每个promise.这适用于单一承诺.然而问题是它对Promise.all不起作用 – 至少是同步的.如果我在我的测试中放了一个小超时,那么它通过正常.
以下是一些片段:
var pipelineRequests = pipelineNames.map(function(pipelineName) {
return gocdClient.getPipelineStatus(pipelineName);
});
Promise.all(pipelineRequests)
.then(function(values) {
values.forEach(function(value) {
// Do something now all data is available
});
});
所以这里我得到一个pipelinesNames列表,然后创建一个请求,为每个管道返回一个promise.这在我手动测试时有效.
现在为测试代码:
it("should wait for all to return before processing", function() {
allPipelinesStub
.returnsPromise().resolves({"NFT-Suite": ["Hour", "Overnight", "Weekend"]});
pipelineStatusStub
.withArgs("Hour")
.returnsPromise().resolves({"status": "Passed", "build-number": 1, "upstream": ["GIT"]});
pipelineStatusStub
.withArgs("Overnight")
.returnsPromise().resolves({"status": "Passed", "build-number": 1, "upstream": ["GIT"]});
pipelineStatusStub
.withArgs("Weekend")
.returnsPromise().resolves({"status": "Passed", "build-number": 1, "upstream": ["GIT"]});
var pipelinesService = require('../../src/services/pipelinesService');
var pipelines = pipelinesService.getPipelines();
should.exist(pipelines);
pipelines.should.deep.equal({
"NFT-Suite": {
"Hour": {
"status": "Passed",
"build-number": 1,
"order": 0
},
"Overnight": {
"status": "Passed",
"build-number": 1,
"order": 0
},
"Weekend": {
"status": "Passed",
"build-number": 1,
"order": 0
}
}
});
});
问题是管道是{}.如果调用pipelinesService.getPipelines();经过一段时间的延迟,它工作正常.
单独测试这些是很好的,因为存根同步解决,我只是找不到强制Promise.all完成后解决的方法.
有没有办法强迫这个?或者我可以使用sinon(或其他东西)将其存在?
感谢任何帮助
解决方法:
你需要决定你在测试什么.如果你想使用Promise.all测试代码,你需要返回promise – 或者至少是一些承诺,表明操作已经完成.这并不意味着您必须从现有代码返回承诺:您可以将逻辑包装在另一个私有函数“_foo”中,让现有代码使用它,然后从外部测试“foo”而不是原始代码.
如果这是在getPipelines()内部,那么如果你刚刚做了测试,测试就会起作用:
return pipelinesService.getPipelines().then(() => {
should.exist(pipelines);
pipelines.should.deep.equal({
// more code ....
});
内容总结
以上是互联网集市为您收集整理的Javascript单元同步测试Promise.all全部内容,希望文章能够帮你解决Javascript单元同步测试Promise.all所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。