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?
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);
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