заглушка функции в прокси-объекте

Я хочу протестировать следующий упрощенный модуль:

const Logger = require('logplease');
const logger = Logger.create('utils');

const tester = {

    one: () => {
        logger.log('called real one()');
        tester.two();
    },
    two: () => {
        logger.log('called real two()');
    },
};

module.exports = {
    one: tester.one,
    two: tester.two
};

Я заменяю внешнюю зависимость logplease с помощью Proxyquire, который работает очень хорошо. Однако мне нужно заглушить two(), потому что я хочу провести модульное тестирование one(), устраняя при этом побочные эффекты, которые two() вызывает при работе в реальном коде.

it.only('stubbing functions on the "proxyquired" object under test', function(done) {

    const loggerStub = {
        create: () => {
            return { log: (msg) => { console.log('fake logger: ', msg); } };
        }
    };

    let tester = proxyquire('../tester', { 'logplease': loggerStub });

    let stub2 = sinon.stub(
        tester, 
        'two', 
        () => { 
            console.log('called fake stub of two()'); 
        }
    );

    tester.one();

    console.log('call count 2: ', stub2.callCount);
    done();
});

Вывод, который я получаю:

fake logger:  called real one() 
fake logger:  called real two() 
call count 2: 0

Вывод, который я ожидаю:

fake logger:  called real one() 
called fake stub of two()
call count 2: 1

Почему моя функция-заглушка не работает?


person montrealist    schedule 10.02.2017    source источник
comment
Возможно, я нашел свой ответ: js" title="проверить, вызывает ли функция другую функцию в модуле es6 с помощью sinon js"> stackoverflow.com/questions/35111367/   -  person montrealist    schedule 13.02.2017


Ответы (1)


Короткий ответ:

const Logger = require('logplease');
const logger = Logger.create('utils');

const tester = {

    one: () => {
        logger.log('called real one()');
        tester.two();
    },
    two: () => {
        logger.log('called real two()');
    },
};

module.exports = tester;

Объяснение: область

Вы экспортировали один и два как:

module.exports = {
    one: tester.one,
    two: tester.two
};

В этом случае tester.one знает только об этой функции:

two: () => {
    logger.log('called real two()');
}

и понятия не имею о заглушенных два. Итак, у вас есть две версии двух, просто попробуйте вызвать tester.two() внутри теста.

person Nazar Sakharenko    schedule 20.02.2017