2015-09-21 9 views
20

Biorąc pod uwagę, że mam dwie klasy ES6.Jak kpić z klas zależności dla testów jednostkowych za pomocą mocha.js?

Jest to klasa A:

import B from 'B'; 

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

A klasa B:

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

Jestem jednostki badań przy użyciu mocha (z babel dla ES6), chai i sinon, który działa naprawdę świetnie. Ale w jaki sposób mogę zapewnić próbną klasę klasy B podczas testowania klasy A?

Chcę wyśmiać całą klasę B (lub potrzebną funkcję, tak naprawdę nie ma znaczenia), aby klasa A nie wykonywała prawdziwego kodu, ale mogę zapewnić funkcjonalność testowania.

To, co test mokka wygląda teraz:

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

przeczytać o [DI] (https://en.wikipedia.org/wiki/Dependency_injection) – Mritunjay

Odpowiedz

20

Można użyć SinonJS stworzyć stub aby zapobiec prawdziwą funkcję do wykonania.

Na przykład, biorąc pod uwagę klasy A:

import B from './b'; 

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

export default A; 

A klasa B:

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

export default B; 

Test mógłby wyglądać następująco:

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

Następnie można w razie potrzeby przywrócić funkcję używanie object.method.restore();:

var stub = sinon.stub (object, "method");
Zastępuje object.method funkcją . Oryginalną funkcję można przywrócić, dzwoniąc pod numer object.method.restore(); (lub stub.restore();). Wyjątek jest zgłaszany , jeśli właściwość nie jest już funkcją, aby uniknąć klepnięć po metodach stubblowania po .

+0

Woa. Tak proste. Nie myślałem o zmianie prototypu. Dzięki! :) Czy masz wskazówkę, jak kpić z konstruktora? Wydaje się, że nie działa w ten sam sposób? – mvmoay

+1

Sprawdź tę odpowiedź Dałem kilka dni temu http://stackoverflow.com/questions/32550115/mocking-javascript-constructor-with-sinon-js/32551410#32551410 – victorkohl

+0

Jak zrobiłbyś to dla konstruktora B? – Willwsharp

Powiązane problemy