Sinon Вызов функции, переданной в качестве аргумента конструктору - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть следующие классы A и B,

class A {
    listenResponse(port, callback) {
        const server = new CustomServer(port, (error, response) => {
            if (error) return callback(error);
            callback(null, response);
        });
    }
}

class CustomServer {
   constructor(port, callback) {
      this.port = port;
      this.server = http.createServer((request, response) => {
         if(// condition) { return callback(error); }
         callback(null, response);
      });
   }
}

Как проверить функцию, переданную конструктору CustomServer во время модульного тестирования класса A? Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 06 февраля 2020

Вот решение для модульного тестирования с использованием дополнительного модуля proxyquire :

a.js:

const CustomServer = require('./customServer');

class A {
  listenResponse(port, callback) {
    const server = new CustomServer(port, (error, response) => {
      if (error) return callback(error);
      callback(null, response);
    });
  }
}

module.exports = A;

customServer.js:

class CustomServer {
  constructor(port, callback) {
    this.port = port;
    this.server = http.createServer((request, response) => {
      callback(null, response);
    });
  }
}
module.exports = CustomServer;

a.test.js:

const sinon = require('sinon');
const proxyquire = require('proxyquire');

describe('60084056', () => {
  it('should get response', () => {
    const error = null;
    const response = {};
    const customServerStub = sinon.stub().yields(error, response);
    const A = proxyquire('./a.js', {
      './customServer': customServerStub,
    });
    const a = new A();
    const port = 3000;
    const callback = sinon.stub();
    a.listenResponse(port, callback);
    sinon.assert.calledWithExactly(customServerStub, port, sinon.match.func);
    sinon.assert.calledWithExactly(callback, null, response);
  });

  it('should handle error', () => {
    const error = new Error('network');
    const response = {};
    const customServerStub = sinon.stub().yields(error, response);
    const A = proxyquire('./a.js', {
      './customServer': customServerStub,
    });
    const a = new A();
    const port = 3000;
    const callback = sinon.stub();
    a.listenResponse(port, callback);
    sinon.assert.calledWithExactly(customServerStub, port, sinon.match.func);
    sinon.assert.calledWithExactly(callback, error);
  });
});

Результаты модульных испытаний с отчетом о покрытии:

 60084056
    ✓ should get response (1684ms)
    ✓ should handle error


  2 passing (2s)

-----------------|---------|----------|---------|---------|-------------------
File             | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------------|---------|----------|---------|---------|-------------------
All files        |      70 |      100 |      50 |   66.67 |                   
 a.js            |     100 |      100 |     100 |     100 |                   
 customServer.js |      25 |      100 |       0 |      25 | 3-5               
-----------------|---------|----------|---------|---------|-------------------

Исходный код: https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60084056

...