Chai间谍和异步电话不会拨打一次电话

时间:2016-06-08 13:44:33

标签: javascript node.js testing mocha chai

我正在构建一个应用程序,我需要在快速回调解析中测试一些回调行为。

实际上,它看起来像是:

const callbackRender = (httpResponse, response) => {
  console.log(httpResponse) // logs the good httpResponse object
  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) {
      return result.then(res => callbackRender(res, response))
    } else {
      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.on(callbackRender)
      callback(injector, routes[3])(request, response).then((res) => {
        expect(spy).to.have.been.called.once
        mock.verify()
        mock.restore()
        done()
      })
    })

    it('should call the callback render method when httpResponse is not a promise', () => {
      const mock = sinon.mock(injector)
      const ctrl = new UserControllerMock()
      const routes = routeParser.parseRoutes()
      mock.expects('get').returns(ctrl)
      const spy = chai.spy.on(callbackRender)
      callback(injector, routes[1])(request, response)
      expect(spy).to.have.been.called.once
      mock.verify()
      mock.restore()
    })

似乎chai-spies无法检测到我的callbackRender函数在回调方法中被调用。

事实是,当我记录我的方法时,每次我需要它时都会传递它。

有人有想法吗?

编辑:beforeEach中的请求/响应定义

 beforeEach(() => {
    request = {
      body: {},
      params: {},
      query: {}
    }
    response = {
      send: () => {
      },
      render: () => {
      }
    }});

1 个答案:

答案 0 :(得分:1)

间谍/存根/模拟只有在替换原始函数(带有包装版本),(如果它们被明确传递)时才能工作(这不是你的代码中的情况。)

在您的情况下,callbackRender未被替换(由于const而不能替换它,但也因为它没有“父”对象可以替换它),所以任何会调用它的代码(如callback)都会调用原始函数,而不是间谍。

解决方案取决于您的代码的确切结构。

如果callbackcallbackRender位于一个单独的模块中,您可以使用rewire与间谍“替换”callbackRender

但是,有一点需要注意的是rewire也无法替换const variables,因此您的代码必须更改。