测试在promise解析中调用函数

时间:2016-06-07 11:33:31

标签: javascript node.js unit-testing mocha chai

我正构建一个应用程序,我需要在其中测试已在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中的日志消息会解析,我可以在屏幕上显示它。

有什么想法吗?

1 个答案:

答案 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,所以你的间谍可能仍然没有被调用。

相关问题