2015-01-26 4 views
13

Se uso sinon con dattiloscritto, come faccio a lanciare il sinon mock a un'istanza del mio oggetto?Come uso Sinon con Typescript?

Ad esempio un SinonMock verrebbe restituito ma il mio controller sottoposto a test potrebbe richiedere un servizio specifico inoltrato al suo costruttore.

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

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

Si può usare sinon con Typescript?

risposta

5

Potrebbe essere necessario utilizzare un <any> tipo di affermazione per rendere il tipo largo prima di restringere al vostro tipo specifico:

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

Giusto per chiarire un comportamento di Sinon - anche se si passa MyStuff.MyService, qualunque cosa tu passare al metodo mock viene utilizzato solo per fornire messaggi di errore migliori.

Se si desidera che la simulazione abbia metodi e proprietà, you need to add them.

Se si desidera falsi creati automaticamente, è possibile afferrare il FakeFactory da tsUnit, che crea una falsa versione con alcuni valori di default che si può scegliere di ignorare - in JavaScript questa è roba abbastanza facile (più non usando troppo finto funzionalità, è possibile assicurarsi di testare il comportamento piuttosto che l'implementazione).

utilizzo Esempio di FakeFactory:

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

Sì, ho fatto qualcosa di simile a questo. Ho anche appreso che stavo usando l'oggetto sinon in modo errato, non mi ero reso conto che tutto ciò che dovevo fare era usare l'istanza MyService originale nelle chiamate e utilizza i sinon mock/stubs. Quello che hai messo qui sembra corretto per quello che stavo chiedendo in ogni caso, grazie! – Brandon

+0

Sono tornato a questo e sembra che non funzioni. myServiceMock non sembra come se avesse metodi. Qualche idea? – Brandon

+0

Ti è stata data un'aspettativa? 'myServiceMock.expects (" doSomething "). returns (42);' – Fenton

11

Sinon può creare uno stub sulla base di un costruttore abbastanza facilmente se, invece di mock, si utilizza il metodo createStubInstance.

Un esempio utilizzando mocha, chai, sinon e sinon-chai, potrebbe assomigliare a questo:

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 = <any> sinon.createStubInstance(MyStuff.MyService), 
      controller = new MyStuff.MyController(myService, ...); 

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

Sono published an article, che si potrebbe trovare utile se vuoi saperne di più sui diversi test raddoppia e come usarli con Sinon.js.

Spero che questo aiuti!

gen

+2

Puoi anche usare 'import * come sinonChai da 'sinon-chai';' assumendo che i tipi siano installati: 'npm i --save-dev @ types/sinon-chai'. – Westy92