使用node-mock -http来测试没有发出事件的服务

Using node-mocks-http to test a service no event emitted

本文关键字:出事件 服务 node-mock -http 测试 使用      更新时间:2023-09-26

我有一个简单的服务,我想通过调用它的控制器来测试。我认为应该使用node-mock -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);
}

这是我的测试(Jasmine):

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 :向回购问题

在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);
  });
});