我希望在单元测试时在代码中存根内部函数,例如:
//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
功能
答案 0 :(得分:0)
如果操作正确,Sinon 完全有能力处理这个问题,您只需要记住 sinon 替换对象中的引用,并且 export
不是函数声明的位置。但是使用相同的代码和测试,对 bar 做一个简单的修改就可以了:
function bar() {
//Logic...
exports._foo();
//Logic...
}