javascript - Chai spy 和异步调用不会调用一次

标签 javascript node.js testing mocha.js 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: () => {
      }
    }});

最佳答案

Spies/stubs/mocks 只有在它们可以替换原始函数(使用包装版本)时才能工作,如果它们被显式传递(这不是您代码中的情况)。

在你的例子中,callbackRender 没有被替换(它不可能被替换,因为 const 但也因为它没有它所在的“父”对象可以替换),因此任何调用它的代码(如 callback)都将调用原始函数,而不是 spy 。

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

如果 callbackcallbackRender 一起位于一个单独的模块中,您也许可以使用 rewire用 spy “替换”callbackRender

但是,需要注意的是 rewire 也不能替代 const variables ,因此您的代码必须更改。

关于javascript - Chai spy 和异步调用不会调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704307/

相关文章:

javascript - 点击2个id更新.map()数组jquery

javascript - Codeigniter 中不同 Controller 的不同 JavaScript、JQuery 或 CSS

javascript - 如何解决 "Access Denied: Invalid token, wrong code"的问题?

node.js - 检查 Node 中的错误参数

testing - Geb(自动化测试框架)是一个好的验收测试框架吗?

perl - 测试::更多:由于转义序列而导致的糟糕计划

javascript - Android 原生浏览器中的双击行为

javascript - 在 PHP 循环中使用 javascript onclick

javascript - Node.js 异步函数未被识别为有效的异步函数

testing - 通过Sahi脚本打开新浏览器后如何在新浏览器上运行sahi脚本