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

Súvisiace články