NodeJS 如何使用ESM测试与jest?

nimxete2  于 2022-12-12  发布在  Node.js
关注(0)|答案(6)|浏览(223)

我的设定

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

(1)CommonJS应用程序(含.js测试)

  • package.json包含"type": "commonjs"
  • 名为test.js的测试文件
  • 错误:SyntaxError: Cannot use import statement outside a module(这是预期的,因为测试是以commonjs档案执行。)

(2)CommonJS应用程序(含.mjs测试)

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

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

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

(4)CommonJS应用程序和CommonJS测试

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

mbyulnm01#

下面是我使用ESM运行Jest的测试步骤。测试中的源文件也是使用ESM编写的。
1.将节点版本设置为14.16.0
1.安装Jest:

npm i jest -D

1.将"type": "module"加到package.json
1.更新package.json中的test脚本:

"scripts": {
  "test": "node --experimental-vm-modules ./node_modules/.bin/jest"
}

1.创建包含以下内容的jest.config.js文件:

export default { transform: {} }

1.使用默认的testMatch(我的在__tests__目录中)至少可以找到一个测试
1.运行测试:

npm test

在GitHub的magic-comments-loader仓库中有一个更完整的例子。

k7fdbhmy

k7fdbhmy2#

对于我的工作,只需要设置脚本“test”如下:

"test": "cross-env NODE_OPTIONS=--experimental-vm-modules npx jest"

还有别忘了-〉npm i cross-env jest

wqnecbli

wqnecbli3#

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

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

必须包含"js"是时代模块的历史遗留物,其中明显是.js文件。请遵循https://github.com/facebook/jest/issues/12116进行更新。

bfhwhh0e

bfhwhh0e4#

这里是你需要的最低限度。 prop @卢克为上面的评论与testMatch的答案,我需要。

  1. package.json-确保"type": "module"在其中
  2. jest.config.js-将以下glob添加到testMatch数组中:"**/?(*.)+(spec|test).(m)js"
    1.确保测试文件以.spec.mjs.test.mjs结尾,以匹配glob
    1.将npm test脚本设置为node --experimental-vm-modules ./node_modules/.bin/jest
    就是这样。您***不需要***jest配置中的转换设置为the documentation suggests
xhv8bpkk

xhv8bpkk5#

在我的情况下,离开

  • 包. json中的"type": "module"

和重命名

  • jest.config.jsjest.config.cjs
  • babel.config.jsbabel.config.cjs

工作过的

goucqfw6

goucqfw66#

我按照@morganney的答案,但我得到这个错误:"basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")..."。所以为了使它工作,我使用了documentation中的属性"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
因此,我的package.json最终配置如下:

{
      "type": "module", 
        "jest": {
          "transform": {}
        },
         "scripts": {
            "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
         }
       "dependencies": {
        "jsdom": "^17.0.0",
       }
    }

相关问题