【问题标题】:Stub an internal functions?存根一个内部函数?
【发布时间】:2018-01-27 01:28:50
【问题描述】:

我想在我的代码中对一个内部函数进行单元测试,例如:

//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 函数?

【问题讨论】:

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


    【解决方案1】:

    如果正确处理,Sinon 完全有能力处理这个问题,你只需要记住 sinon 替换对象中的引用,export 不是函数声明的地方。但使用相同的代码和测试,对 bar 进行简单修改即可:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2021-01-24
      • 2018-06-12
      • 2017-09-22
      相关资源
      最近更新 更多