【发布时间】: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