Typescript 如何用Jest模拟模拟模块的方法?
我试图用笑话模拟电子模块中的“对话”,并遇到下面的问题。 直接在对象上设置模拟时,它正在工作(案例1)。但是,当在变量中存储模拟函数并在模拟对象中设置该函数时失败(情况2)。有什么意见吗?为什么会这样?一般来说,我对jest和js都是新手。然而,我认为这两种情况应该表现相同 案例1:工作Typescript 如何用Jest模拟模拟模块的方法?,typescript,jestjs,electron,Typescript,Jestjs,Electron,我试图用笑话模拟电子模块中的“对话”,并遇到下面的问题。 直接在对象上设置模拟时,它正在工作(案例1)。但是,当在变量中存储模拟函数并在模拟对象中设置该函数时失败(情况2)。有什么意见吗?为什么会这样?一般来说,我对jest和js都是新手。然而,我认为这两种情况应该表现相同 案例1:工作 jest.mock('electron', () => ({ dialog: { showOpenDialog: jest.fn(()=>({filePaths:['']})), }
jest.mock('electron', () => ({
dialog: {
showOpenDialog: jest.fn(()=>({filePaths:['']})),
},
}));
案例2:不工作。错误:TypeError:electron_1.dialog.showOpenDialog不是函数
const showOpenDialogMock = jest.fn(()=>({filePaths:['']}));
jest.mock('electron', () => ({
dialog: {
showOpenDialog: showOpenDialogMock,
},
}));
测试:
提前感谢。
jest.mock
调用被移动到文件顶部(已提升)。因此,在案例2中,mock是在定义const showOpenDialogMock
之前创建的
实际运行的代码看起来更像:
jest.mock('electron',()=>({
对话框:{
showOpenDialog:showOpenDialogMock,
},
}));
const showOpenDialogMock=jest.fn(()=>({filepath:['']}));
知道了这一点,您可以尝试以下方法:
从“electron”导入{dialog};
mock('electron',()=>({
对话框:{
showOpenDialog:jest.fn(()=>({filepath:['']})),
},
}));
测试(“菜单单击”,异步()=>{
const setDirMenuItem=subMenu.getSetProjectDirSubMenu(
test("Menu click", async () => {
const setDirMenuItem = subMenu.getSetProjectDirSubMenu(
<any>mainWindow,
<any>projectSettings
);
await setDirMenuItem.click();
expect(showOpenDialogMock).toHaveBeenCalledTimes(1);
}
);
export const getSetProjectDirSubMenu = (
mainWindow: BrowserWindow,
projectSettings: ProjectSettings
) => ({
label: 'Set Project Directory',
click: async () => {
const result = await dialog.showOpenDialog(mainWindow, {
properties: ['openDirectory'],
defaultPath: projectSettings.getProjectDir()
});
if (result.filePaths[0]) {
projectSettings.setProjectDir(result.filePaths[0]);
mainWindow.webContents.send('PROJECT_DIRECTORY_SET', {});
}
}
});