存根内部功能?

时间:2017-08-18 11:15:11

标签: javascript node.js unit-testing mocha stubbing

我希望在单元测试时在代码中存根内部函数,例如:

//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会花费很多时间来调用(数据库调用,文件IO ......),而我可以使用proxyquire来存根所有fs和db调用立即终止,来自foo测试的重复代码,不可读,完全不好。

简单的解决方案是存根foo,但是proxyquire似乎不喜欢这样。一个幼稚的foo._foo = stubFoo也没有用。 Rewire似乎也不会处理这个问题。

我能做的就是制作一个导入和导出foobar.js的文件,并在其上使用proxyquire,但这个想法本身已经不好了。

如何在测试foo

时存根bar功能

1 个答案:

答案 0 :(得分:0)

如果操作正确,Sinon 完全有能力处理这个问题,您只需要记住 sinon 替换对象中的引用,并且 export 不是函数声明的位置。但是使用相同的代码和测试,对 bar 做一个简单的修改就可以了:

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