jedinično testiranje - Kako koristiti Sinon s Typescriptom?


Ako koristim sinon s TypeScriptom, kako onda mogu kastati sinon mock na instancu mog objekta?

Na primjer, SinonMock bi bio vraćen, ali moj kontroler koji se testira može zahtijevati da mu se u konstruktor proslijedi određena usluga.

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

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

Može li se sinon koristiti s Typescriptom?

Odgovor #1

Sinon može prilično lako stvoriti stub temeljen na konstruktoru ako, umjesto mock, koristite metodu createStubInstance.

Primjer koji koristi mocha, chai, sinon i sinon-chai, mogao bi izgledati ovako:

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

Objavio sam članak koji bi vam mogao biti koristan ako želite saznati više o različitim testnim dvostrukima i kako ih koristiti sa Sinon.js.

Nadam se da ovo pomaže!

Siječanj

Odgovor #2

Možda ćete trebati koristiti <any> tvrdnju tipa kako biste proširili tip prije nego što ga suzite na svoj specifični tip:

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

Samo da pojasnim jedno ponašanje sinon-a - iako prosljeđujete MyStuff.MyService, što god da proslijedite metodi mock koristi se samo za pružanje boljih poruka o greškama.

Ako želite da mock ima metode i svojstva, morate ih dodati.

Ako želite automatski kreirane lažnjake, možete uzeti FakeFactory iz tsUnit, koja stvara lažnu verziju s nekim zadanim vrijednostima koje možete odlučiti nadjačati - u JavaScriptu je ovo prilično jednostavno (osim toga, ne koristeći previše funkcionalnosti za mockiranje, možete osigurati da testirate ponašanje, a ne implementaciju).

Primjer korištenja FakeFactory:

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

Povezani članci