2015-09-21 6 views
20

Dato che ho due classi ES6.Come simulare le classi di dipendenza per il test delle unità con mocha.js?

Si tratta di classe A:

import B from 'B'; 

class A { 
    someFunction(){ 
     var dependency = new B(); 
     dependency.doSomething(); 
    } 
} 

e Classe B:

class B{ 
    doSomething(){ 
     // does something 
    } 
} 

Sono unit testing utilizzando moka (con babel per ES6), Chai e Sinon, che funziona davvero grande. Ma come posso fornire una classe di simulazione per la classe B durante il test della classe A?

Voglio prendere in giro l'intera classe B (o la funzione necessaria, in realtà non importa) in modo che la classe A non esegua il codice reale ma posso fornire funzionalità di test.

Questo è, ciò che il test moka sembra per ora:

var A = require('path/to/A.js'); 

describe("Class A",() => { 

    var InstanceOfA; 

    beforeEach(() => { 
     InstanceOfA = new A(); 
    }); 

    it('should call B',() => { 
     InstanceOfA.someFunction(); 
     // How to test A.someFunction() without relying on B??? 
    }); 
}); 
+0

leggi su [DI] (https://en.wikipedia.org/wiki/Dependency_injection) – Mritunjay

risposta

20

È possibile utilizzare SinonJS per creare un stub per evitare che la funzione reale da eseguire.

Ad esempio, data classe A:

import B from './b'; 

class A { 
    someFunction(){ 
     var dependency = new B(); 
     return dependency.doSomething(); 
    } 
} 

export default A; 

e Classe B:

class B { 
    doSomething(){ 
     return 'real'; 
    } 
} 

export default B; 

Il test potrebbe essere simile:

describe("Class A",() => { 

    var InstanceOfA; 

    beforeEach(() => { 
     InstanceOfA = new A(); 
    }); 

    it('should call B',() => { 
     sinon.stub(B.prototype, 'doSomething',() => 'mock'); 
     let res = InstanceOfA.someFunction(); 

     sinon.assert.calledOnce(B.prototype.doSomething); 
     res.should.equal('mock'); 
    }); 
}); 

È quindi possibile ripristinare la funzione, se necessario utilizzando object.method.restore();:

var stub = sinon.stub (oggetto, "metodo");
Sostituisce object.method con una funzione di stub . La funzione originale può essere ripristinata chiamando object.method.restore(); (o stub.restore();). Viene generata un'eccezione se la proprietà non è già una funzione, per evitare errori di battitura durante i metodi di stubing .

+0

Woa. Così facile. Non pensavo di alterare il prototipo. Grazie! :) Hai un suggerimento su come prendere in giro il costruttore? Sembra non lavorare allo stesso modo? – mvmoay

+1

Controlla questa risposta che ho dato qualche giorno fa http://stackoverflow.com/questions/32550115/mocking-javascript-constructor-with-sinon-js/32551410#32551410 – victorkohl

+0

Come lo faresti per il costruttore di B? – Willwsharp