【问题标题】:Rewire and import of other module重新连接和导入其他模块
【发布时间】:2016-06-10 07:01:20
【问题描述】:

我正在尝试使用 rewire external module 在模块之间进行一些测试。

其实我有这两个模块:

import callbackRender from './callbackRender'
import { HttpRequest } from 'default-http'

export default (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)
    }
  }
}


export default (httpResponse, response) => {
  if (httpResponse.content.content) response.send(httpResponse.content.content)
  else response.render(httpResponse.content.page)
}

我正在尝试如下测试:

import chai from 'chai'
import { HttpRequest, HttpResponse } from 'default-http'
import UserControllerMock from './UserControllerMock'
import expressKonnector from '../app/expressKonnector'
import callbackRender from '../app/callbackRender'
import rewire from 'rewire'
import spies from 'chai-spies'
import sinon from 'sinon'
import chaiAsPromised from 'chai-as-promised'
const expect = chai.expect
const callback = rewire('../app/callback')
callback.__set__({
  'callbackRender': callbackRender
})
chai.use(spies)
chai.use(chaiAsPromised)

/**
* Some other working tests ...
*/

  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)
      callbackRender({content: {content: 'toto'}}, response)
      expect(spy).to.have.been.called.once
      mock.verify()
      mock.restore()
    })

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

我想你明白了,我需要在回调方法中监视我的callbackRender。这就是为什么我需要回调模块中的callbackRender 模块,所以我需要重新连接它。

我已经在文件顶部进行了重新布线,如下所示:

const callback = rewire('../app/callback')
callback.__set__({
  'callbackRender': callbackRender
})

但是当我运行测试时,出现以下错误:

Message:
    callbackRender is not defined Stack: ReferenceError: callbackRender is not defined
    at Function.eval (eval at __set__ (C:\Project\javascript\express-konnector\src\app\callback.js:75:19), <anonymous>:1:16)
    at Function.__set__ (C:\Project\javascript\express-konnector\src\app\callback.js:75:5)
    at Object.<anonymous> (C:/Project/javascript/express-konnector/src/test/expressKonnector.spec.js:12:10)

【问题讨论】:

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


    【解决方案1】:

    the limitations 中所述,rewire 在与转译器结合使用时无法正常工作。它以babel-plugin-rewire 的形式提供了一个可能的解决方案。

    这是一个简单的测试用例(显然,您的代码更复杂,但它只是提供一个如何工作的示例):

    // callbackRender.js
    export default function callbackRender() {
      console.log('hello world');
    }
    
    // callback.js
    import callbackRender from './callbackRender';
    
    export default function callback() {
      callbackRender();
    }
    
    // test.js
    import assert   from 'assert';
    import sinon    from 'sinon';
    import callback from './callback';
    
    it('should call the callback', () => {
      let spy = sinon.spy();
    
      // Replace `callbackRender` with a spy
      callback.__Rewire__('callbackRender', spy);
    
      // Call the function
      callback();
    
      // Assert that the callback got called, once.
      assert(spy.calledOnce);
    
      // Reset to the original.
      callback.__ResetDependency__('callbackRender');
    });
    

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 2019-03-14
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多