【问题标题】:Jest throwing reference error about an import inside a node_modules dependency开玩笑地抛出关于 node_modules 依赖项中的导入的引用错误
【发布时间】:2021-07-14 14:26:04
【问题描述】:

我有一个通过 Jest 进行工作测试的 nestjs monorepo 应用程序。这与全局单元测试有关,它们从 package.json 中的 nestjs CLI 创建的配置中获取配置。

我的 storage.service.ts 在其中一种方法中使用 jimp 来调整图像大小。

这具有依赖于@jimp/gif@jimp/types 依赖关系,而@jimp/gif 又依赖于gifwrap

对于在我的控制台中运行的每个测试,我都会看到以下错误:

ReferenceError: You are trying to `import` a file after the Jest environment has been torn down.

      at node_modules/.pnpm/gifwrap@0.9.2/node_modules/gifwrap/src/gifcodec.js:7:15

我也在使用 beforeAll() 和 afterAll() 钩子来关闭 nestjs 模块。

笑话配置:

  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": ".",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "./coverage",
    "testEnvironment": "node",
    "roots": [
      "<rootDir>/apps/",
      "<rootDir>/libs/"
    ],
    "moduleNameMapper": {
...

我怎样才能消除这个错误,或者甚至像修复它一样大胆?

【问题讨论】:

  • 这个问题你解决了吗?
  • 这个人运气好吗?
  • 很遗憾,不,我相信降级到另一个打字稿版本,特别是 4.0.6 并使用 yarn 而不是 pnpm 暂时解决了问题,但不是永久解决方案
  • 我使用的是 JS 而不是 TS,这也发生在我身上,我已将 jimp 版本从 0.10.x 更新为 0.16.1

标签: jestjs nestjs nestjs-testing


【解决方案1】:

将 jest config 中的 timers 配置为 modern 为我解决了这个问题:jest-docs

"timers": "modern",

【讨论】:

  • 这也为我解决了。即使使用 jest.useFakeTimers("modern") 也不起作用,但是这样做了。
【解决方案2】:

不确定它是否会对您的情况有所帮助,但我在我的打字稿项目中解决它的方法是模拟 jimp 导入本身。我正在测试一个使用一些包含 Jimp 的类的类。与其嘲笑所有这些,嘲笑 jimp 更容易。

jest.mock('jimp', () => {
  return {};
}

我把它放在我的导入下面和我的测试之前。根据您正在做的事情,您可能还需要更深入地了解您的模拟。示例:

jest.mock('jimp', () => {
  return {
    read: jest.fn().mockImplementation(),
  };
});

我在 jest 25 上做到了,但我认为它也适用于大多数其他版本。

我的 jest.config.js 文件:

module.exports = {
  moduleFileExtensions: ['js', 'json', 'ts'],
  rootDir: 'src',
  testRegex: '\\.spec\\.ts$',
  transform: {
    '^.+\\.(t|j)s$': 'ts-jest',
  },
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/$1',
    '^src/(.*)$': '<rootDir>/$1',
  },
  testPathIgnorePatterns: ['e2e/'],
  coverageDirectory: '../coverage',
  testEnvironment: 'node',
};

process.env = Object.assign(process.env, {
  APP_ENV: 'development',
});

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,并且只有在测试同步时才会出现此问题。
    最小超时解决了问题:

    afterAll(async () => {
      await new Promise(resolve => setTimeout(resolve));
    });
    

    afterAll(done => {
      setTimeout(done);
    });
    

    【讨论】:

    • 我已将afterAll(done =&gt; { setTimeout(done); }); 添加到我的setupTest.js,因此这会将代码全局应用于所有单元测试,只更改一个文件,它解决了我的问题
    • 就我而言,我必须使用afterEach 而不是afterAll 才能消除错误。
    猜你喜欢
    • 2018-07-20
    • 2021-05-22
    • 2020-01-14
    • 2021-07-22
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2021-07-13
    • 2019-07-05
    相关资源
    最近更新 更多