jest类型脚本未对节点模块使用__模拟__

ldxq2e6h  于 2023-03-21  发布在  Jest
关注(0)|答案(2)|浏览(170)

我的应用程序有一个正常运行的Jest/Flow设置。我们切换到TypeScript,我所有的测试都失败了。我把所有的东西都转换成.ts和.test.ts,并修复了所有的bug。由于某种原因,我的__mocks__都不再使用了。(我不得不模拟一些自动锁失败的模块)
例如,下面的代码用于在任何需要的时候模拟电子,并允许代码调用模拟对话框,这样我就可以检查错误用例是否报告了错误。因为我转换为TypeScript,所以任何时候在测试中命中require ("electron"),它都会失败,并说remote未定义。
例如)aFile.test.ts

import reportError from "../aFile.ts";
const { dialog } = require ("electron").remote;

describe ("reportError", () =>
{
   test ("creates dialog", () =>
   {
      const title   = "foo";
      const message = "bar";
      reportError (title, message);

      expect (dialog.showErrorBox).toHaveBeenLastCalledWith (title, message);
   });
});

例如)aFile.ts

const { dialog } = require ("electron").remote;
export default function reportError (title: string, message: string)
{
   dialog.showErrorBox (title, message);
}

例如)__mocks__/electron.js(节点模块的同级)
module.exports = { remote: { dialog: { showErrorBox: jest.fn () } } };
我可以肯定mock没有被使用,因为当我向任何失败的.test.ts文件添加以下代码时,它就开始通过了:
jest.mock ("electron", () => { return { remote: { dialog: { showErrorBox: jest.fn () } } } });
为什么TypeScript找不到我的__mocks__

mwecs4sa

mwecs4sa1#

我使用了以下解决方法来解决此问题:
创建mocks.js

jest.mock ("electron", () => 
  {
     return { remote: { dialog: { showErrorBox: jest.fn () } } };
  });

在package.json中,将其添加到jest部分(mocks.js所在的路径):

"jest":
{
   "setupFiles": [ "<rootDir>/../mocks.js" ]
},

这将全局模拟electron和你在这里声明的任何其他模块,类似于拥有__mocks__文件夹。你可能会把每个模块放在它自己的文件中,然后添加到setupFiles数组中。

yhived7q

yhived7q2#

类型脚本、模拟和ES模块

我遇到了这个问题,并解决了它- TypeScript使用__mocks__node_modules。我使用ES模块,虽然它是许多年后。

由于当前的答案是一个变通方案,我想我应该提供自己的配置作为真正的解决方案。

我看到的错误

TypeError: localforage.getItem is not a function
基本上有很多东西是没有定义的。

工作配置

我想模拟node_modules/localforage中的node_module。
使用此模块的文件使用导入此模块
import localforage from "localforage";
因此模拟必须有一个默认导出。
其他文件使用import * as localforage from "localforage";导入
因此,这意味着我还必须创建named export(export const someName)。
模拟文件的格式为__mocks__/localforage.ts

// localforage doesn't work in node, so simulate it
const fakeLocalForageStore: Record<string, any> = {};

// Exported to allow import * as localforage to work
export const getItem = (key) => {
  return fakeLocalForageStore[key] || null;
};

// Exported to allow import * as localforage to work
export const setItem = (key, value) => {
  return (fakeLocalForageStore[key] = value);
};

// Exported to allow import localforage from "localforage"; to work
export default {
  getItem,
  setItem,
};

测试只需运行:

jest.mock("localforage");

而且很管用。

调试提示:

*检查你的模块是如何被导入的. import name from moduleimport * as name from moduleimport { name } from module?你的模拟必须提供和你的原始模块相同的导出。这是我怀疑大多数人都有问题的部分。

  • node_modules__mocks__需要位于同级目录中。
  • 您可以登录mock以确保jest实际上正在加载它
  • 检查模块是如何在使用它的模块中使用的。他们使用默认导出吗?他们使用命名导出吗?你的模拟模块提供这些吗?

相关问题