gpt4 book ai didi

typescript - 如何使用 Jest 模拟模拟模块的方法?

转载 作者:行者123 更新时间:2023-12-03 12:23:56 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com