【发布时间】:2016-10-07 06:57:42
【问题描述】:
我正在构建一个应用程序,我需要在其中测试回调函数是否已在承诺解析中被调用。
其实我有以下代码:
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 resolve 部分中的日志消息,我可以将其显示在屏幕上。
有什么想法吗?
【问题讨论】:
-
异步代码需要异步测试。
-
正是我对 setTimeout 所做的:o
-
不完全...
setTimeout不会在这里帮助您(至少,不可预测)。在检查expect语句之前,您的测试需要 wait for the resolved promise。 -
我不知道如何让它工作。在我的情况下,我无法访问返回的承诺
标签: javascript node.js unit-testing mocha.js chai