2015-09-21 3 views
20

Учитывая, что у меня есть два класса ES6.Как издеваться над классами зависимостей для модульного тестирования с помощью mocha.js?

Это класс A:

import B from 'B'; 

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

А класс B:

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

Я модульное тестирование с использованием мокко (с Вавилонской для ES6), Chai и Sinon, который работает действительно здорово. Но как я могу предоставить класс mock для класса B при тестировании класса A?

Я хочу высмеять весь класс B (или нужная функция, на самом деле не имеет значения), так что класс A не выполняет реальный код, но я могу обеспечить функциональность тестирования.

Это, что тест мокко выглядит на данный момент:

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

читать об [DI] (https://en.wikipedia.org/wiki/Dependency_injection) – Mritunjay

ответ

20

Вы можете использовать SinonJS создать stub, чтобы предотвратить реальную функцию, которая будет выполнена.

Например, данный класс A:

import B from './b'; 

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

export default A; 

А класс B:

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

export default B; 

тест может выглядеть следующим образом:

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

Вы можете восстановить функцию при необходимости с использованием object.method.restore();:

var stub = sinon.stub (объект, "метод");
Заменяет объект.method функцией . Исходную функцию можно восстановить, вызвав object.method.restore(); (или stub.restore();). Исключение составляет , если свойство еще не является функцией, чтобы избежать опечаток при методах stubbing .

+0

Woa. Это просто. Не думал об изменении прототипа. Благодаря! :) У вас есть подсказка о том, как издеваться над конструктором? Кажется, не работает одинаково? – mvmoay

+1

Отметьте этот ответ, который я дал несколько дней назад http://stackoverflow.com/questions/32550115/mocking-javascript-constructor-with-sinon-js/32551410#32551410 – victorkohl

+0

Как бы вы это сделали для конструктора B? – Willwsharp

Смежные вопросы