我正在尝试使用 jest 模拟 Electron 模块中的“对话框”并遇到以下问题。
当直接在它正在工作的对象上设置模拟时(案例 1)。但是,当将模拟函数存储在变量中并将其设置在模拟对象中时会失败(案例 2)。任何输入为什么会这样?一般来说,我是 jest 和 js 的新手。但是我认为这两种情况应该表现相同。
案例一:工作
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,
},
}));
测试: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', {});
}
}
});
提前致谢。
最佳答案
jest.mock
调用被移动到文件的顶部(提升)。所以在案例 2 中,模拟是在 const showOpenDialogMock
之前创建的。被定义为。
实际运行的代码看起来更像:
jest.mock('electron', () => ({
dialog: {
showOpenDialog: showOpenDialogMock,
},
}));
const showOpenDialogMock = jest.fn(()=>({filePaths:['']}));
知道了这一点,您可以尝试以下方法:import {dialog} from 'electron';
jest.mock('electron', () => ({
dialog: {
showOpenDialog: jest.fn(()=>({filePaths:['']})),
},
}));
test("Menu click", async () => {
const setDirMenuItem = subMenu.getSetProjectDirSubMenu(
<any>mainWindow,
<any>projectSettings
);
await setDirMenuItem.click();
// note: dialog.showOpenDialog
expect(dialog.showOpenDialog).toHaveBeenCalledTimes(1);
});
More on module functions and mocking modules from Jest documentation.
关于typescript - 如何使用 Jest 模拟模拟模块的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65192860/