Javascript 模拟默认导出失败,但命名导出未成功

Javascript 模拟默认导出失败,但命名导出未成功,javascript,ecmascript-6,jestjs,mocking,Javascript,Ecmascript 6,Jestjs,Mocking,我有一个lets say file.js,有类似这样的代码 const myFunc = () => { return { func1: () => {}, func2: () => {} } } export const myObject = { key: '' }; export default myFunc(); 我试图在我的测试中用玩笑来模拟这个导出。假设file.test.js是测试文件 jest.mock('.

我有一个lets say file.js,有类似这样的代码

const myFunc = () => {
    return {
        func1: () => {},
        func2: () => {}
    }
}

export const myObject = {
 key: ''
};

export default myFunc();
我试图在我的测试中用玩笑来模拟这个导出。假设file.test.js是测试文件

jest.mock('./path/file', () => {
    return {
         default: {
              func1: jest.fn(),
              func2: jest.fn()
         },
         myObject: {}
    };
});
但是当我的测试正在运行时,它会抛出一个错误,告诉我
\u File.default.func1不是一个函数

如何正确模拟既有默认导出又有命名导出的js文件?

解决方案:

index.ts

constmyfunc=()=>{
返回{
func1:()=>{},
func2:()=>{},
};
};
导出常量myObject={
键:“”,
};
导出默认myFunc();
index.test.ts

从“/”导入fns,{myObject};
嘲笑('./',()=>{
返回{
myObject:{key:'teresa teng'},
func1:jest.fn(),
func2:jest.fn(),
};
});
描述('64003254',()=>{
它('应该通过',()=>{
expect(jest.isMockFunction(fns.func1)).toBeTruthy();
expect(jest.isMockFunction(fns.func2)).toBeTruthy();
expect(myObject.key).toBe('teresa teng');
});
});
单元测试结果:

通过src/stackoverflow/64003254/index.test.ts(11.809s)
64003254
✓ 应通过(6ms)
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:13.572秒

func1:jest.fn()
创建一个名为
func1
的属性,其结果是调用
jets.fn()由于您正在该代码中调用函数。。。除非调用
jest.fn()
返回一个函数,否则删除
()
-或者
func1:()=>{return jest.fn();}
-看起来就像
file.js中的代码一样now@JaromandaX它确实有用,谢谢。但我使用jest.fn()作为间谍函数传递的其他地方。为什么它没有在那里断开?我看不到你使用它的所有其他地方,所以我无法帮助你理解你自己的代码。。。如果要调用函数,请执行
fn()
-如果要将函数传递给某个对象,请使用有意义的
fn
。谢谢你救了我一天。@JaromandaX,所以这应该很好用。