Javascript 如何模拟模块导出函数

Javascript 如何模拟模块导出函数,javascript,testing,mocking,sinon,Javascript,Testing,Mocking,Sinon,我有一个导出如下的函数: // myFunc.js .... .... module.exports = myFunc; 在另一个文件中,我有: // main.js const myFunc = require('../../myFunc'); ... ... myFunc.then( .... ) 如何使用另一个函数模拟myFunc.js中的myFunc? 我试过: sinon.stub(myFuncFilePath).callsFake(myOtherFuncFilePath); 但

我有一个导出如下的函数:

// myFunc.js
....
....
module.exports = myFunc;
在另一个文件中,我有:

// main.js
const myFunc = require('../../myFunc');
...
...
myFunc.then( .... )
如何使用另一个函数模拟
myFunc.js
中的
myFunc
? 我试过:

sinon.stub(myFuncFilePath).callsFake(myOtherFuncFilePath);
但它不起作用,显然是因为
myFunc
的导出方式。
我不能改变它在
myFunc.js
中导出的方式,否则我怎么能模拟它呢?

sinon不直接支持存根函数。您需要使用重新布线模块:

例如。
myFunc.js

异步函数myFunc(){ console.log('myFunc'); } module.exports=myFunc;
main.js

const myFunc=require('./myFunc');
函数main(){
返回myFunc()。然后(res=>console.log(res));
}
module.exports=main;
main.spec.js

const sinon=require('sinon');
const{expect}=require('chai');
const proxyquire=require('proxyquire');
描述('main',()=>{
它('should stub myFunc',async()=>{
const myFuncStub=sinon.stub().resolves('false data');
常量main=proxyquire(“./main”{
“./myFunc.js”:myFuncStub
});
const logSpy=sinon.spy(控制台,'log');
常量实际值=等待主();
expect(实际).to.be.undefined;
expect(myFuncStub.calledOnce).to.be.true;
expect(logSpy.calledWith('false data')).to.be.true;
});
});
单元测试结果和覆盖率报告:

main
假数据
✓ 应为myFunc存根(44ms)
1次通过(49毫秒)
--------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
--------------|----------|----------|----------|----------|-------------------|
所有文件| 94.44 | 100 | 80 | 94.12 ||
main.js | 100 | 100 | 100 | 100 ||
main.spec.js | 100 | 100 | 100 | 100 ||
myFunc.js | 50 | 100 | 0 | 50 | 2|
--------------|----------|----------|----------|----------|-------------------|

源代码:

sinon不直接支持存根函数。您需要使用重新布线模块:

例如。
myFunc.js

异步函数myFunc(){ console.log('myFunc'); } module.exports=myFunc;
main.js

const myFunc=require('./myFunc');
函数main(){
返回myFunc()。然后(res=>console.log(res));
}
module.exports=main;
main.spec.js

const sinon=require('sinon');
const{expect}=require('chai');
const proxyquire=require('proxyquire');
描述('main',()=>{
它('should stub myFunc',async()=>{
const myFuncStub=sinon.stub().resolves('false data');
常量main=proxyquire(“./main”{
“./myFunc.js”:myFuncStub
});
const logSpy=sinon.spy(控制台,'log');
常量实际值=等待主();
expect(实际).to.be.undefined;
expect(myFuncStub.calledOnce).to.be.true;
expect(logSpy.calledWith('false data')).to.be.true;
});
});
单元测试结果和覆盖率报告:

main
假数据
✓ 应为myFunc存根(44ms)
1次通过(49毫秒)
--------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
--------------|----------|----------|----------|----------|-------------------|
所有文件| 94.44 | 100 | 80 | 94.12 ||
main.js | 100 | 100 | 100 | 100 ||
main.spec.js | 100 | 100 | 100 | 100 ||
myFunc.js | 50 | 100 | 0 | 50 | 2|
--------------|----------|----------|----------|----------|-------------------|
源代码: