Javascript 用另一个模块来模拟一个模块
编辑:问题已修复,请参见下文 我在我的应用程序上使用Jest,我想用另一个模块来模拟一个模块。换句话说,我希望在测试中调用第一个模块时,用第二个模块替换第一个模块 如果我将模拟代码放在测试文件中,效果很好,如下所示:Javascript 用另一个模块来模拟一个模块,javascript,jestjs,mocking,Javascript,Jestjs,Mocking,编辑:问题已修复,请参见下文 我在我的应用程序上使用Jest,我想用另一个模块来模拟一个模块。换句话说,我希望在测试中调用第一个模块时,用第二个模块替换第一个模块 如果我将模拟代码放在测试文件中,效果很好,如下所示: *src/app/module.js* export default { method : () => //doSomethingComplicated } *src/__tests__/test.js* import module from "../app/
*src/app/module.js*
export default {
method : () => //doSomethingComplicated
}
*src/__tests__/test.js*
import module from "../app/module.js"
jest.mock("..app/module.js", () => {
return {
method : () => //doSomethingSimpler
}
)
*src/app/module.js*
export default {
method : () => //doSomethingComplicated
}
*src/__mocks__/mockModule.js*
export default {
method : () => //doSomethingSimpler
}
*src/__tests__/test.js*
import mockModule from "../__mocks__/mockModule.js"
import module from "../app/module.js"
jest.mock("..app/module.js", () => {
return mockModule
})
但是,我没有成功地在一个单独的文件中重构我的代码,比如:
*src/app/module.js*
export default {
method : () => //doSomethingComplicated
}
*src/__tests__/test.js*
import module from "../app/module.js"
jest.mock("..app/module.js", () => {
return {
method : () => //doSomethingSimpler
}
)
*src/app/module.js*
export default {
method : () => //doSomethingComplicated
}
*src/__mocks__/mockModule.js*
export default {
method : () => //doSomethingSimpler
}
*src/__tests__/test.js*
import mockModule from "../__mocks__/mockModule.js"
import module from "../app/module.js"
jest.mock("..app/module.js", () => {
return mockModule
})
我收到一个错误:TypeError:无法读取未定义的属性“default”
jest.mock('../app/module.js', () => {
return {
__esModule: true,
default: jest.fn(() => mockModule)
};
});
我试图为导出命名,但遇到了相同的错误:“无法读取未定义的属性‘mockModule’”(mockModule是导出的名称)
我还尝试了Jest文档中的ES6修复。测试在此情况下运行,但失败,错误为:TypeError:无法设置未定义的属性“method”
jest.mock('../app/module.js', () => {
return {
__esModule: true,
default: jest.fn(() => mockModule)
};
});
看来我在开玩笑的工厂里做错了什么,但我不知道问题出在哪里。。。你有什么建议吗?
非常感谢
编辑:我自己解决了这个问题,更深入地查看了文档:
简单地说:模拟模块应该放在子目录
/\uuuuuu mocks\uuuu/
中,与要模拟的模块位于同一目录中。然后你只需要调用jest.mock(“../app/myModule”)
,不带任何工厂参数:jest会自动找到mock并用这个模块替换原来的模块。编辑帖子,给出我找到的修复方法