web-dev-qa-db-fra.com

Comment utiliser Sinon avec Typescript?

Si j'utilise sinon avec TypeScript, comment puis-je caster la maquette sinon dans une instance de mon objet?

Par exemple, un SinonMock serait retourné mais mon contrôleur sous test peut nécessiter un service spécifique transmis à son constructeur.

var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));

controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);

Peut-on sinon être utilisé avec Typescript?

22
Brandon

Vous devrez peut-être utiliser un <any> assertion de type pour élargir le type avant de le restreindre à votre type spécifique:

var myServiceMock: MyStuff.MyService = 
    <MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));

Juste pour clarifier un comportement de sinon - bien que vous passiez MyStuff.MyService, tout ce que vous transmettez à la méthode mock est uniquement utilisé pour fournir de meilleurs messages d'erreur.

Si vous voulez que la maquette ait des méthodes et des propriétés, vous devez les ajouter .

Si vous voulez des faux créés automatiquement, vous pouvez récupérer le FakeFactory de tsUnit , ce qui crée une fausse version avec des valeurs par défaut que vous pouvez choisir de remplacer - en JavaScript, c'est assez simple (De plus, en n'utilisant pas trop de fonctionnalités de simulation, vous pouvez vous assurer de tester le comportement plutôt que l'implémentation).

Exemple d'utilisation de FakeFactory:

var target = tsUnit.FakeFactory.getFake<RealClass>(RealClass);
var result = target.run();
this.areIdentical(undefined, result);
16
Fenton

Sinon peut créer un stub basé sur un constructeur assez facilement si, au lieu de mock, vous utilisez la méthode createStubInstance.

Un exemple utilisant mocha , chai , sinon et sinon-chai , pourrait ressembler à ceci:

import * as sinon from 'sinon';
import * as chai from 'chai';

// ... imports for the classes under test

const expect    = chai.expect;
const sinonChai = require("sinon-chai");

chai.use(sinonChai);

describe('MyController', () => {
    it('uses MyService', () => {

        let myService  = sinon.createStubInstance(MyStuff.MyService),
            controller = new MyStuff.MyController(myService as any, ...);

        // ... perform an action on the controller 
        // that calls myService.aMethodWeAreInterestedIn

        // verify if the method you're interested in has been called if you want to
        expect(myService.aMethodWeAreInterestedIn).to.have.been.called;
    });
});

J'ai publié un article , que vous pourriez trouver utile si vous souhaitez en savoir plus sur les différents tests doubles et comment les utiliser avec Sinon.js.

J'espère que cela t'aides!

Jan

17
Jan Molak