Подтвердить что ты не робот

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

Учитывая, что у меня есть два класса ES6.

Это класс A:

import B from 'B';

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

И класс B:

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

Я тестирую устройство с использованием мокко (с babel для 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???
    });
});
4b9b3361

Ответ 1

Вы можете использовать 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(объект, "метод" );
Заменяет object.method на заглушка. Исходную функцию можно восстановить, позвонив object.method.restore(); (или stub.restore();). Исключено исключение если свойство еще не является функцией, чтобы избежать опечаток, когда методы обрушения.