2017-09-25 5 views
0

Je Sinon ai les modules suivants:une dépendance par injection dans une classe stub de ES6 avec

const rp = require('request-promise'); 

// dummies.repository.js 

exports.getDummiesData =() => { 
    const options = { 
    url: 'https://api.github.com/users', 
    headers: { 
     'User-Agent': 'Request-Promise', 
    }, 
    json: true 
    }; 
    return rp(options) 
    .then(r => r) 
    .catch(err => { throw err; }); 

} 

Le fichier ci-dessus est une dépendance à une classe que je voudrais tester. Je l'injectons dans la classe inférieure par son constructeur comme ceci:

// dummies.service.js 
const Dummies = require('./dummies.model'); 
class DummiesService { 
    constructor(dummiesRepository) { 
    this.dummiesRepository = dummiesRepository; 
} 

getDummies() { 
    return new Promise((resolve, reject) => { 
     this.dummiesRepository.getDummiesData() 
     .then((response) => { 
     // business logic 
     const dummies = response.map(d => new Dummies(d)); 
     resolve(dummies); 
     }) 
     .catch((response) => { 
     reject(response); 
     }); 
    }); 
    } 
} 
module.exports = DummiesService; 

Dans ce qui précède, je veux tester la méthode getDummies avec sinon. Mon approche jusqu'ici a été de remplacer le dummiesRepository et d'injecter cela à mon service de mannequins pendant l'instanciation, mais j'obtiens une erreur. Voici comment mon test ressemble:

const DummiesService = require('../dummies.service'); 
const dummiesRepository = require('../dummies.repository'); 
let dummiesRepositoryStub; 

afterEach(() => { 
    if(dummiesRepositoryStub){ 
    dummiesRepositoryStub.restore(); 
    } 
}); 

describe('unit: dummies.service - when getting dummies data',() => { 
    it('it should resolve and return dummies data',() => { 
    const dummiesResponse = [ 
     { id: 1, login: 'dummy1', additionalData: 'data' }, 
     { id: 2, login: 'dummy2', additionalData: 'data' }, 
     { id: 3, login: 'dummy3', additionalData: 'data' }, 
    ]; 

    dummiesRepositoryStub = sinon 
     .stub(dummiesRepository, 'getDummiesData') 
     .resolves(dummiesResponse); 

    dummiesService = new DummiesService(dummiesRepositoryStub); 
    // act + assert 
    return dummiesService.getDummies() 
     .then((response) => { 
     chai.expect(dummiesRepositoryStub.called).to.equal(true); 
     chai.expect(response).to.deep.equal(dummiesTransformedModel); 
     }); 
    }); 

Ce test échoue avec l'erreur TypeError: this.dummiesRepository.getDummiesData is not a function. Je ne suis pas sûr pourquoi cela ne fonctionne pas, j'ai injecté une implémentation stub de dummiesRepository à la classe DummiesService. Veuillez aider.

+0

Il manquait une seule citation sur la première ligne. 'const rp = require ('request-promise);' devrait être 'const rp = require (' request-promise ');' – SteamDev

+0

Merci, mais ce n'est pas mon erreur. J'ai juste manqué la question – strizzwald

Répondre

0

Je ne pouvais pas trouver un moyen de faire l'injection du constructeur dans le code ci-dessus, mais j'ai trouvé un moyen de contourner le problème pour permettre à mon corps de contourner ma méthode.

J'ai dû supprimer dummyRepository d'une dépendance de constructeur à simplement utiliser require pour l'inclure. Si le code se présente comme suit

const Dummies = require('./dummies.model'); 
const dummiesRepository = require('./dummies.repository'); 

class DummiesService { 
    constructor() { 
    this.dummiesRepository = dummiesRepository; 
    } 
    getDummies() { 
    return new Promise((resolve, reject) => { 
     this.dummiesRepository.getDummiesData() 
     .then((response) => { 
      // business logic 
      const dummies = response.map(d => new Dummies(d)); 
      resolve(dummies); 
     }) 
     .catch((response) => { 
      reject(response); 
     }); 
    }); 
    } 
} 

module.exports = DummiesService; 

et le test est écrit comme ci-dessus, mais instanciation DummyService sans dummyRepositoryStub comme paramètre, tout fonctionne bien.

Cela fonctionne, mais j'aimerais quand même savoir s'il existe un moyen d'injecter la dépendance via le constructeur, car cette approche nécessite de refactoriser une grande partie de mon code.