包含承诺的单元测试处理程序

问题描述 投票:0回答:1

我具有TDD知识,并且我一直在尝试使用相同的原理在javascript中启动一个项目。

我正在构建一个API,一旦被点击,它就会向外部服务发出一个请求,以收集一些数据,一旦检索到,便对其进行解析并返回响应。

[到目前为止,我对自己的传奇不走运,我进行了很多搜索,因此我发现的最相似的问题是one。但是我无法成功应用相同的解决方案。

我在实现方面的实现如下:

//... other handlers
weather(request, response) {
    //... some setup and other calls
    this.externalService.get(externalURL)
        .then(serviceResponse => {
            this.externalResponseParser.parse(serviceResponse)
        });
    //... some more code
}

在测试方面:

let requester;
let mockParser;
let handler;
let promiseResolve;
let promiseReject;

beforeEach(function () {
    requester = new externalRequesterService();
    mockParser = sinon.createStubInstance(...);

    handler = new someHandler({
        externalService: requester,
        externalResponseParser: mockParser
    });
});

it('returns data', function () {
    sinon.stub(requester, 'get').callsFake((url) => {
        return new Promise((resolve, reject) => {
            // so I can be able to handle when the promise gets resolved
            promiseResolve = resolve;
            promiseReject = reject;
        });
    });

    handler.weather(request, response);

    // assertions of what happens before externalService.get gets called - all green

    promiseResolve(expectedServiceResponse);

    assert.ok(mockExternalResponseParser.parse.calledOnce, 'Expected externalResponseParser.parse to have been called once');
});

在测试的最后一行,它失败了,即使我在呼唤我应该的声音。在某些时候,我添加了一些日志记录,并且我能够看到then块的代码似乎在测试中的断言之后被执行,这可能是问题的根源。

我试图找出是否可以使用某种eventually,因此我在解决诺言后的断言如下:

assert.eventually(mockExternalResponseParser.parse.calledOnce, 'Expected externalResponseParser.parse to eventually be called once');

但没有运气。

有人对缺少的内容有清楚的解释吗?提前非常感谢

P.S。-根据要求,请找到我的代码here的精简版本。只需运行npm install,然后运行npm test,即可获得相同的输出。

javascript unit-testing promise mocha sinon
1个回答
0
投票

谢谢大家所花费的时间。

© www.soinside.com 2019 - 2024. All rights reserved.