开玩笑:语法错误:无法在模块外部使用 import 语句

问题描述 投票:0回答:1

我正在 Node/TS 项目中编写测试,这是一个后端 API(没有 babel,没有 webpack,没有 React/Angular/vue/...)。 那么我的项目就是一个 CommonJS 项目。

我使用 Jest 作为测试框架。

一切都很顺利,因为我必须使用 npm 包(https://www.npmjs.com/package/file-type)[file-type],它是一个 ESM。

在运行时一切正常,我的 API 工作得很好。

但是我使用它编写的测试,即使它被嘲笑,也会因以下错误而失败:

Details:

/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/file-type/index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import * as strtok3 from 'strtok3';
                                                                                  ^^^^^^

SyntaxError: Cannot use import statement outside a module

我在 jest.config.ts 中尝试了多种配置组合,但没有任何效果。

有人已经设法在 CommonJS 项目中使用 EMS 包并使用它编写测试吗?

非常感谢。

jest.config.ts:

reset: "ts-jest/presets/js-with-ts", // tries "ts-jest" and "ts-jest/presets/default-esm"
testEnvironment: "node",
transform: {
    "^.+\\.(ts|tsx)?$": "ts-jest"
  },
transformIgnorePatterns: [
    "node_modules/",
    "\\.pnp\\.[^\\/]+$"
  ],
npx jest path/to/my/file.test.ts

应该运行测试套件,但失败并显示:

Jest encountered an unexpected token

Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.

Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

By default "node_modules" folder is ignored by transformers.

Here's what you can do:
 • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
 • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript
 • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
 • If you need a custom transformation specify a "transform" option in your config.
 • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

You'll find more details and examples of these config options in the docs:
https://jestjs.io/docs/configuration
For information about custom transformations, see:
https://jestjs.io/docs/code-transformation

Details:

/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/file-type/index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){import * as strtok3 from 'strtok3';
                                                                                  ^^^^^^

SyntaxError: Cannot use import statement outside a module
    at new Script (node:vm:94:7)
    at Runtime.createScriptFromCode (/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/jest-runtime/build/index.js:1505:14)
    at Runtime._execModule (/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/jest-runtime/build/index.js:1399:25)
    at Runtime._loadModule (/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/jest-runtime/build/index.js:1022:12)
    at Runtime.requireModule (/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/jest-runtime/build/index.js:882:12)
    at Runtime.requireModuleOrMock (/home/bonjourjohn/projects/arpilabe/ged-backend/node_modules/jest-runtime/build/index.js:1048:21)
    at /home/bonjourjohn/projects/arpilabe/ged-backend/src/services/FileTypeService.ts:8:25
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
typescript jestjs es6-modules ts-jest commonjs
1个回答
0
投票

我终于找到了让它发挥作用的方法。

我没有模拟该包(这显然仍然会以某种方式触发其依赖项的导入),而是简单地使用了

moduleNameMapper
配置。

我编写了一个存根,其中仅包含我在包中使用的功能,将其放在我的

__mock__
文件夹中的某个位置,并且我将 Jest 配置为使用此存根而不是真正的包:

  moduleNameMapper: {
    "file-type": "<rootDir>/src/__mocks__/file-type.ts",
  },
© www.soinside.com 2019 - 2024. All rights reserved.