如何开玩笑地使用 ESM 测试?

Luk*_*uke 5 javascript node.js node-modules jestjs

我的设置

  • 节点 v14.16.0
  • 我有一个测试文件,其中包含一个用 ESM 模块 ( import)编写的简单测试。
  • package.json我有一个脚本(遵循适用于 Windows 的Jest 文档):"test": "set \"NODE_OPTIONS=--experimental-vm-modules\" && npx jest"
  • 我的测试运行 w/ npm run test(上面的脚本)

我的目标:使用 jest 运行 ESM 测试。

我的尝试:

(1) 带有 .js 测试的 CommonJS 应用程序

  • package.json 包含 "type": "commonjs"
  • 测试文件命名 test.js
  • 错误:(SyntaxError: Cannot use import statement outside a module这是意料之中的,因为测试是作为 commonjs 文件运行的。)

(2) 带有 .mjs 测试的 CommonJS App

  • package.json 包含 "type": "commonjs"
  • 测试文件命名 test.mjs
  • 错误:No tests found(Jest 没有找到文件?)

(3) 带有 .js 或 .mjs 的 ESM 应用程序

  • package.json 现在有 "type": "module"
  • 名为test.mjs或的测试文件test.js
  • 错误: ReferenceError: module is not defined at ...jest.config.js:6:1

(4) CommonJS App和CommonJS测试

  • package.json 包含 "type": "commonjs"
  • 已命名test.js但使用 commonjsrequire语法的测试文件(并且没有我想包含的 ESM 模块);请注意,这不是我想要的,只是为了表明测试本身没有任何问题。
  • 测试运行良好并通过

mor*_*ney 48

以下是我使用 ESM 运行 Jest 并进行测试所采取的步骤。测试中的源文件也是使用 ESM 编写的。

  1. 将我的节点版本设置为 14.16.0

  2. 安装笑话:

    npm i jest -D
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加"type": "module"package.json

  4. 更新test脚本package.json

    "scripts": {
      "test": "node --experimental-vm-modules ./node_modules/.bin/jest"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 创建一个jest.config.js包含以下内容的文件:

    export default { transform: {} }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 至少有一个可以使用默认值找到的测试testMatch(我的在__tests__目录内)

  7. 运行测试:

    npm test
    
    Run Code Online (Sandbox Code Playgroud)

GitHub 上的magic-comments-loader存储库中有一个更完整的示例。

  • 这似乎与我的尝试#3 相同,但由于某种原因,这现在对我有用。我不确定默认配置是否需要执行第 5 步。我还切换到 `.mjs` 作为测试文件,因此添加到我的 `jest.config.mjs` 文件中:`"mjs"` 到 `moduleFileExtensions`,以及 `"**/?(*.)+(spec| test).(m)js?(x)"` 到 `testMatch`。 (2认同)
  • 添加测试标志 basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") 之后收到此错误? (2认同)
  • 我将测试属性更改为: "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" 来自文档 https://jestjs.io/pt-BR/docs/ecmascript - 模块 (2认同)

joe*_*ain 9

经过大量摆弄后,这是我成功的设置(重要的部分):

  • package.json
  "type": "commonjs",
  "script": {
    "test": "NODE_OPTIONS=--experimental-vm-modules jest"
  }
Run Code Online (Sandbox Code Playgroud)
  • jest.config.mjs(是的,esModule)
export default {
  moduleFileExtensions: [
    "mjs",
    // must include "js" to pass validation https://github.com/facebook/jest/issues/12116
    "js",
  ],
  testRegex: `test\.mjs$`,
};
Run Code Online (Sandbox Code Playgroud)

必须包含的内容"js"是时代模块的历史遗迹,其中显然是 .js 文件。关注https://github.com/facebook/jest/issues/12116进行更新。


Vla*_*nko 8

对于我来说,只需按如下方式设置脚本“test”即可:

“测试”:“跨环境 NODE_OPTIONS=--experimental-vm-modules npx 玩笑”

是的,别忘了 ->npm i cross-env jest