如何模拟节点网库函数的返回值?

时间:2017-02-07 10:18:36

标签: node.js unit-testing sinon

我有一个Node模块,我尝试连接到主机:

const testConnection = net.createConnection(port, hostname);

testConnection.on('connect', () => {
   // connected
});

testConnection.on('error', (err) => {
   // error
});

我正在使用 Sinon 来测试这样的方法:

sinon.stub(net, 'createConnection', (port, hostname) => {
   return {
      on: (string, cb) => {
         switch(string) {
              case 'connect':
                  return cb;
              case 'error':
                  return cb;
              case 'close':
                  return cb;
            }
        }
    }
});

const testConnection = net.createConnection(10, 'hostname');
testConnection.on('error', () => {
   console.log('here I am');
});

但是我无法理解我应该如何不应该使用存根/模拟或伪调用on-method,因此它会返回错误!

  

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:1)

我使用假的EventEmitter实例来存储createConnection返回值:

const EventEmitter = require('events');
const fakeEE = new EventEmitter();
sinon.stub(net, 'createConnection', (port, hostname) => fakeEE);

// require your code

// emit events
fakeEE.emit('error', new Error('Smth bad happened'));

// observe the result
// e.g. expect(something).toBeCalled();

答案 1 :(得分:0)

由于XY是模块的依赖关系,我会使用proxyquire伪造该依赖关系。使用ES6 + Babel组合也非常适合我们。