简体   繁体   中英

Test that a function is called in a promise resolution

I m building an application in which I need to test that a callbackfunction has been called in promise resolution.

Actually, I have the following code :

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)
    }
  }
}

I need to test that the

result.then(res => {
        console.log('hey I m in !')
        callbackRender(res, response)
      })

is well called.

I have written this test using mocha and chai, and I m always having 0 time spy calls :

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)
    })

NB : The log message in the promise resolve part if well called, and I can display it on the screen.

Any idea ?

Return your response, then you can call then in your test.

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));
    }
  }
}

Your test:

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()
      });
  });

Although, you don't seem to be injecting callbackRender, so your spy might still not get called.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM