Подтвердить что ты не робот

Сжатие JavaScript-конструктора с Sinon.JS

Я хотел бы unit test следующий класс ES6:

// service.js
const InternalService = require('internal-service');

class Service {
  constructor(args) {
    this.internalService = new InternalService(args);
  }

  getData(args) {   
    let events = this.internalService.getEvents(args);
    let data = getDataFromEvents(events);
    return data;
  }
}

function getDataFromEvents(events) {...}

module.exports = Service;

Как мне высмеять конструктор с Sinon.JS, чтобы издеваться над getEvents из internalService, чтобы протестировать getData?

Я посмотрел Javascript: Mocking Constructor с помощью Sinon, но не смог извлечь решение.

// test.js
const chai = require('chai');
const sinon = require('sinon');
const should = chai.should();

let Service = require('service');

describe('Service', function() {
  it('getData', function() {
    // throws: TypeError: Attempted to wrap undefined property Service as function
    sinon.stub(Service, 'Service').returns(0);
  });
});
4b9b3361

Ответ 1

Вы можете создать пространство имен или создать экземпляр заглушки, используя sinon.createStubInstance (это не вызовет конструктор).

Создание пространства имен:

const namespace = {
  Service: require('./service')
};

describe('Service', function() {
  it('getData', function() {
    sinon.stub(namespace, 'Service').returns(0);
    console.log(new namespace.Service()); // Service {}
  });
});

Создание экземпляра заглушки:

let Service = require('./service');

describe('Service', function() {
  it('getData', function() {
    let stub = sinon.createStubInstance(Service);
    console.log(stub); // Service {}
  });
});

Ответ 2

Так как sinon.createStubInstance был удален из последних версий Sinon, я бы предложил обмануть отдельные методы экземпляра на прототипе, чтобы добиться желаемого эффекта. Что-то вроде этого:

const spy = sinon.stub(InternalService.prototype, 'getEvents').returns([{ id: 1 }]);
const internalService = new InternalService();
console.log(internalService.getEvents());
// => [{ id: 1 }]