jednotkové testovanie - Ako používam Sinon s Typescriptom?
Ak používam Sinon s TypeScriptom, ako potom prevediem Sinon mock na inštanciu môjho objektu?
Napríklad by sa vrátil SinonMock, ale môj kontrolér, ktorý je testovaný, môže vyžadovať konkrétnu službu odovzdanú do jeho konštruktora.
var myServiceMock: MyStuff.MyService = <MyStuff.MyService (sinon.mock(MyStuff.MyService));
controllerUnderTest = new MyStuff.MyController(myServiceMock, $log);
Môže sa sinon použiť s Typescriptom?
Odpoveď č. 1
Sinon môže celkom ľahko vytvoriť stub na základe konštruktora, ak namiesto mock použijete metódu createStubInstance.
Príklad použitia mocha, chai, sinon a sinon-chai by mohol vyzerať takto:
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;
});
});
Publikoval som článok, ktorý by sa vám mohol hodiť, ak by ste sa chceli dozvedieť viac o rôznych testovacích dvojníkoch a ako ich používať so Sinon.js.
Dúfam, že to pomôže!
Jan
Odpoveď č. 2
Možno budete musieť použiť typové tvrdenie <any>, aby ste typ rozšírili predtým, než ho zúžite na svoj konkrétny typ:
var myServiceMock: MyStuff.MyService =
<MyStuff.MyService> <any> (sinon.mock(MyStuff.MyService));
Len na objasnenie jedného správania sinon - hoci zadáte MyStuff.MyService, čokoľvek, čo zadáte do metódy mock, sa používa len na poskytovanie lepších chybových hlásení.
Ak chcete, aby mal mock metódy a vlastnosti, musíte ich pridať.
Ak chcete automaticky vytvorené falošné objekty, môžete použiť FakeFactory z tsUnit, ktorý vytvorí falošnú verziu s niektorými predvolenými hodnotami, ktoré môžete zmeniť podľa potreby - v JavaScripte je to celkom jednoduché (a navyše, ak nepoužijete príliš veľa mock funkcií, môžete si byť istí, že testujete správanie namiesto implementácie).
Príklad použitia FakeFactory:
var target = tsUnit.FakeFactory.getFake<RealClass>(RealClass);
var result = target.run();
this.areIdentical(undefined, result);
