如何为内部函数创建存根?

3
我想在单元测试中对代码中的内部函数进行存根,例如:
//foobar.js
const uuid = require('uuid');

function foo() {
    console.log('uuid: ' + uuid.v4());
    // Lots of timers
}
exports._foo = foo;

function bar() {
    //Logic...
    foo();
    //Logic...
}
exports.bar = bar;

还有单元测试:

// test/foobar.js
const chai = require('chai'),
    expect = chai.expect,
    proxyquire = require('proxyquire'),
    sinon = require('sinon');

describe('bar', () => {
    it('call foo', () => {
        let foo = proxyquire('./foo.js', {
                uuid: {
                    v4: () => {
                        return '123456789';
                    }
                }
            }),
            fooSpy = sinon.spy(foo._foo);

        foo.bar();
        expect(fooSpy.calledOnce);
    });
});

现在,当我对bar进行单元测试时,我可以很好地对foo进行监视,这非常好。
然而,真正的foo会进行许多耗时的调用(DB调用、文件IO等),虽然我可以使用proxyquire将所有fs和db调用存根化以立即终止,但那样会重复来自foo测试的代码,难以阅读,从而变得不好。

简单的解决方案是存根foo,但是proxyquire似乎不喜欢那样做。一个天真的foo._foo = stubFoo也不起作用。Rewire似乎也无法处理这个问题。

我可以做的是制作一个导入和导出foobar.js的文件,并在其上使用proxyquire,但这个想法本身就很糟糕。

如何在测试bar时存根foo函数?

1个回答

0

如果正确使用,Sinon 完全可以处理这个问题,你只需要记住 sinon 替换对象中的引用,而 export 不是函数声明的位置。但是通过对 bar 进行简单修改,使用相同的代码和测试即可使其正常工作:

function bar() {
    //Logic...
    exports._foo();
    //Logic...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接