最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

JavaScript的单元测试Promise.all同步

运维笔记admin8浏览0评论

JavaScript的单元测试Promise.all同步

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 ....
});
发布评论

评论列表(0)

  1. 暂无评论