JavaScript的单元测试Promise.all同步
我有,我有维护状态和更新这种状态下,每30秒更新循环的对象的Node.js应用程式。基本上,它是同时服务于每个管道输送到前端的最新状态,查询生成计算机构建监控。
在更新循环,我需要多次调用,为此,我需要的所有数据做任何事情,从它有用。目前,我包所有这些呼叫的承诺,并使用Promise.all等待他们全部完成。
在测试中我同步解决每一个承诺与兴农存根,承诺包。这完全适用于单一的承诺。但问题是,它不适合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
的列表,然后创建返回这些管道中的每一个承诺的请求。这工作时我手动测试。
现在的测试代码:
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
}
}
});
});
问题是pipelines
是{}
。如果呼叫pipelinesService.getPipelines();
轻微的延迟之后,它工作正常。
单独测试这些是很好的,因为存根解决了同步,我无法找到一个方法来逼Promise.all后,他们都完全解决。
有没有办法强制呢?或者,我可以用兴农(或别的东西)存根说出来吗?
感谢所有帮助
回答如下:你需要决定你要测试的。如果你想使用测试代码Promise.all
你需要返回的承诺 - 或至少一些承诺,表明该操作已完成。这并不意味着你必须从你现有的代码返回的承诺:你可以用逻辑的另一个私人,函数“_foo”,让你的现有代码的使用是,然后测试“富”来自外部,而不是你的原代码。
如果这里面getPipelines()
测试只会工作,如果你只是做:
return pipelinesService.getPipelines().then(() => {
should.exist(pipelines);
pipelines.should.deep.equal({
// more code ....
});