使用node-mocks-httptesting一个服务,没有事件发出

我有一个简单的服务,我想testing,通过调用它的控制器。 我想我会使用node-mocks-http创build一个模拟请求,并查看响应的结果。 然而,尽pipe所有的文档和示例代码,我无法得到响应发出任何事件(“结束”,“发送”,甚至“错误”),因此不知道何时testing输出。

这是一个简单的function(使用Express 4. *):

export function getServiceHealth(req, res) { let message = 'service has been up for ' + process.uptime() + ' seconds!'; res.status(200).send(message); } 

这是我的testing(茉莉花):

 import {EventEmitter} from 'events'; import httpMock from 'node-mocks-http'; import {getServiceHealth} from '../../lib/controllers/health/'; describe('Service health integration tests', () => { it('should get health', done => { let req = httpMock.createRequest({url: '/health'}); let res = httpMock.createResponse({EventEmitter: EventEmitter}); getServiceHealth(req, res); res.on('end', () => { console.log(res._getData()); done(); }); res.on('send', () => { console.log(res._getData()); done(); }); //setTimeout(() => {console.log(res._getData()); done();}, 1000); }); }); 

我得到这个testing的唯一方法就是完成(不会抛出超时错误),取消setTimeout行注释 – 显然不是正确的方法。 而当我这样做的时候, res的数据正是我所期望的 – 意思是除了事件触发之外,一切正常。

我需要做些什么来获得在res触发的事件?

PS :关于这是一些ES6importshenanigan的机会,我试过这个:

 let res = httpMock.createResponse({EventEmitter: require('events').EventEmitter}); 

同样的结果。

PPS :关于回购的问题

在GitHub上打开一个问题后,我得到了答案:该属性被命名为eventEmitter – 而不是EventEmitter 。 所以我应该写:

var res = httpMocks.createResponse({eventEmitter: EventEmitter});

有点混乱,但我希望他们能够修复文档来反映它。 这个问题仍然是悬而未决的(截至2015年12月29日)未决的文件。

确保在调用getServiceHealth(req,res)之前添加监听器;

 import {EventEmitter} from 'events'; import httpMock from 'node-mocks-http'; import {getServiceHealth} from '../../lib/controllers/health/'; describe('Service health integration tests', () => { it('should get health', done => { let req = httpMock.createRequest({url: '/health'}); let res = httpMock.createResponse({EventEmitter: EventEmitter}); res.on('end', () => { console.log(res._getData()); done(); }); res.on('send', () => { console.log(res._getData()); done(); }); getServiceHealth(req, res); //setTimeout(() => {console.log(res._getData()); done();}, 1000); }); });