我正构建一个应用程序,我需要在其中测试已在promise解析中调用回调函数。
实际上,我有以下代码:
const callbackRender = (httpResponse, response) => {
if (httpResponse.content.content) response.send(httpResponse.content.content)
else response.render(httpResponse.content.page)
}
const callback = (injector, route) => {
return (request, response) => {
const ctrl = injector.get(route.controller)
const result = ctrl[route.controllerMethod](new HttpRequest())
if (result.then) {
result.then(res => {
console.log('hey I m in !')
callbackRender(res, response)
})
} else {
callbackRender(result, response)
}
}
}
我需要测试
result.then(res => {
console.log('hey I m in !')
callbackRender(res, response)
})
很好。
我使用mocha和chai编写了这个测试,并且我总是有0次间谍调用:
it('should call the callback render method when httpResponse is a promise', (done) => {
const mock = sinon.mock(injector)
const ctrl = new UserControllerMock()
const routes = routeParser.parseRoutes()
mock.expects('get').returns(ctrl)
const spy = chai.spy(callbackRender)
callback(injector, routes[3])(request, response)
setTimeout(() => {
expect(spy).to.have.been.called.once
mock.verify()
mock.restore()
done()
}, 0)
})
注意:如果调用好,则promise中的日志消息会解析,我可以在屏幕上显示它。
有什么想法吗?
答案 0 :(得分:1)
返回您的回复,然后您可以在测试中致电then
。
const callback = (injector, route) => {
return (request, response) => {
const ctrl = injector.get(route.controller)
const result = ctrl[route.controllerMethod](new HttpRequest())
if (result.then) {
return result.then(res => {
callbackRender(res, response)
});
} else {
return Promise.resolve(callbackRender(result, response));
}
}
}
你的考试:
it('should call the callback render method when httpResponse is a promise', (done) => {
const mock = sinon.mock(injector)
const ctrl = new UserControllerMock()
const routes = routeParser.parseRoutes()
mock.expects('get').returns(ctrl)
const spy = chai.spy(callbackRender)
callback(injector, routes[3])(request, response).then(() => {
expect(spy).to.have.been.called.once
mock.verify()
mock.restore()
done()
});
});
虽然,你似乎没有注射callbackRender,所以你的间谍可能仍然没有被调用。