Mocking constructeur JavaScript avec Sinon.JS

J’aimerais tester un peu la classe ES6 suivante:

// 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; 

Comment puis-je simuler un constructeur avec Sinon.JS afin de getEvents de internalService pour tester getData ?

J’ai regardé Javascript: Mocking Constructor en utilisant Sinon, mais je n’ai pas pu extraire de solution.

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

Vous pouvez créer un espace de nom ou créer une instance de stub à l’aide de sinon.createStubInstance (cela sinon.createStubInstance pas le constructeur).

Créer un espace de noms:

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

Création d’une instance de stub:

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

Puisque sinon.createStubInstance a été supprimé des dernières versions de Sinon, je suggère de remplacer les méthodes d’instance individuelles sur le prototype pour obtenir l’effet souhaité. Quelque chose comme ça:

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