Typescript 如何用Jest模拟模拟模块的方法?

Typescript 如何用Jest模拟模拟模块的方法?,typescript,jestjs,electron,Typescript,Jestjs,Electron,我试图用笑话模拟电子模块中的“对话”,并遇到下面的问题。 直接在对象上设置模拟时,它正在工作(案例1)。但是,当在变量中存储模拟函数并在模拟对象中设置该函数时失败(情况2)。有什么意见吗?为什么会这样?一般来说,我对jest和js都是新手。然而,我认为这两种情况应该表现相同 案例1:工作 jest.mock('electron', () => ({ dialog: { showOpenDialog: jest.fn(()=>({filePaths:['']})), }

我试图用笑话模拟电子模块中的“对话”,并遇到下面的问题。 直接在对象上设置模拟时,它正在工作(案例1)。但是,当在变量中存储模拟函数并在模拟对象中设置该函数时失败(情况2)。有什么意见吗?为什么会这样?一般来说,我对jest和js都是新手。然而,我认为这两种情况应该表现相同

案例1:工作

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', {});
    }
  }
});