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

标签 typescript jestjs electron

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

相关文章:

reactjs - 如何测试函数是否在功能性 React 组件中调用 onChange?

javascript - 如何强制 Jest 单元测试断言在测试结束之前执行?

reactjs - 如何在 Jest 中向我的测试添加 <canvas> 支持?

electron - 尝试让nedb导入Svelte组件

angular - flatMap, flat, flatten 在类型 any[] 上不存在

javascript - Angular 2 组件变量范围和引用

javascript - 如何正确创建 Angular 域模型

typescript - 从命令行运行 NestJS 脚本

javascript - 如何根据开发环境或生产环境动态导入或需要 js 文件?

build - 使用 Azure 函数为 Windows 版本构建软件?