我正在尝试在测试单独模块时模拟导入模块中的方法。我能够使用ES2015导入语法成功模拟导入的模块,但模拟在整个测试中保持一致,并且有些实例我想要更改模拟。
我的文件看起来像这样
// ModuleA
import ModuleB from 'ModuleB'
// ... code
// TestCase
import ModuleA from 'ModuleA'
import ModuleB from 'ModuleB'
jest.mock('ModuleB', () => {
return {
value: true
}
}
describe('ModuleA', () => {
it('returns true', () => {
// This test expects ModuleB.value to return true
});
it('returns false', () => {
// This doesn't work
ModuleB.value = jest.fn(() => false)
// This doesn't work either
jest.mock('ModuleB', () => {
return {
value: false
}
});
// This test expects ModuleB.value to return false in order to pass
});
});
我当然需要为ModuleB
分开嘲笑。过去,我只能使用var ModuleB = require('ModuleB');
代替import
,然后在需要时调用ModuleB.someMethodName = jest.fn()
。我想仅使用ES2015进行这些测试,并且使用我刚刚提到的模式给出了ModuleB is read-only
错误。
答案 0 :(得分:0)
使用requireActual
方法:
为了确保手动模拟及其实际实现保持同步,在手动模拟中使用require.requireActual(moduleName)并在导出之前使用mock函数修改它可能是有用的。
例如:
const RealModule = require.requireActual('Form');
const MyModule = {
RealThing: RealModule.RealThing,
…add some mocks
};
<强>参考强>