在代理对象中存根函数



我想对以下简化模块进行单元测试:

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

我正在使用 Proxyquire 替换外部依赖项logplease,它运行良好。但是,我需要存根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

为什么我的存根函数不运行?

简短回答:

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;

说明:范围

您将 1 和 2 导出为:

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

在这种情况下,tester.one 只知道这个函数:

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

并且不知道存根两个。所以你有两个版本,只需尝试在测试中调用 tester.two((。

最新更新