我想在单元测试中对代码中的内部函数进行存根,例如:
现在,当我对
然而,真正的
//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
函数?