我正在尝试使用重新连接外部模块在模块之间进行一些测试。
实际上,我有这两个模块:
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)
答案 0 :(得分:4)
正如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');
});