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