我具有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
,即可获得相同的输出。
谢谢大家所花费的时间。