我有一个简单的服务,我想测试,通过调用它的控制器。我想我应该使用节点-模拟-http创建一个模拟请求,并查看响应的结果。然而,尽管有所有的文档和示例代码,我无法获得发出任何事件的响应("end“、"send”甚至"error"),因此无法知道何时测试输出。
下面是一个简单的函数(使用Express 4.*):
export function getServiceHealth(req, res) {
let message = 'service has been up for ' + process.uptime() + ' seconds!';
res.status(200).send(message);
}这是我的测试(茉莉花):
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);
});
});完成这个测试(不抛出超时错误)的唯一方法是取消对setTimeout行的注释--显然这不是正确的方法。当我这么做的时候,res中的数据正是我所期望的--这意味着除了事件触发之外,一切都正常。
我要做什么才能让事件在res上触发
PS:这可能是一些ES6进口的花花公子,我试了一下:
let res = httpMock.createResponse({EventEmitter: require('events').EventEmitter});同样的结果。
PPS:在回购上打开问题
发布于 2015-12-30 03:16:58
打开关于GitHub的问题后,我得到了答案:该属性名为eventEmitter -而不是EventEmitter。所以我应该写:
var res = httpMocks.createResponse({eventEmitter: EventEmitter});
有点混乱,但我希望他们会修正文档来反映它。这一问题仍未解决(截至2015年9月12日),有待文件处理。
发布于 2015-12-30 02:43:49
确保在调用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);
});
});https://stackoverflow.com/questions/32359576
复制相似问题