节点v13 / Jest / ES6 -本机支持没有babel或esm的模块

pkmbmrz7  于 2023-01-22  发布在  Jest
关注(0)|答案(6)|浏览(170)

是否可以在没有esmbabel的情况下使用Jest测试ES6模块?由于node v13本机支持es6,因此尝试了:

//package.json
{
  …
  "type": "module"
  …
}


//__tests__/a.js
import Foo from '../src/Foo.js';

$ npx jest

Jest encountered an unexpected token
…
Details:

/home/node/xxx/__tests__/a.js:1
import Foo from '../src/Foo.js';
^^^^^^

SyntaxError: Cannot use import statement outside a module

当babel添加了一个transpiler,它可以工作,但是es6模块也可以本地使用吗?

cyej8jka

cyej8jka1#

是的,从jest@25.4.0开始是可能的。从这个版本开始,有了对esm的原生支持,所以你不必再用babel来翻译你的代码了。
这一点尚未记录在案,但根据this issue,您必须执行3个简单的步骤才能实现(* 在编写此答案时 *):

  • 通过在jest配置文件中设置transform: {},确保不会转换掉import语句
  • 使用--experimental-vm-modules标志运行node@^12.16.0 || >=13.2.0
  • 使用jest-environment-nodejest-environment-jsdom-sixteen运行测试。

所以你的jest配置文件应该至少包含以下内容:

export default {
    testEnvironment: 'jest-environment-node',
    transform: {}
    ...
};

要设置--experimental-vm-modules标记,您必须从package.json运行Jest,如下所示(* 我希望将来会改变这种情况 *):

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

我希望这个回答对你有帮助。

jrcvhitl

jrcvhitl2#

请注意,这仍然是实验性的,但我们 * 已经 * 记录了如何测试它,所以希望有较少的混乱。
https://jestjs.io/docs/en/ecmascript-modules
https://stackoverflow.com/a/61653104/1850276中的步骤正确

iqxoj9l9

iqxoj9l93#

我遵循了已接受答案中提供的提示,但为了jest能正常工作,我在package.json中添加了属性"type": "module"
package.json中:

"devDependencies": {
    "jest": "^26.1.0",
    "jest-environment-jsdom-sixteen": "^1.0.3",
    "jest-environment-node": "^26.1.0"
  },
  "scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
  },
  "type": "module",
  "jest": {
    "transform": {},
    "testEnvironment": "jest-environment-jsdom-sixteen"
  }
unftdfkk

unftdfkk4#

要在VSCode中使用“--experimental-vm-modules”标志从“jest”扩展运行jest,请将此配置放入全局或工作区设置.json中:

"jest.nodeEnv": {

    "NODE_OPTIONS": "--experimental-vm-modules"
}
watbbzwu

watbbzwu5#

除了@Radovan Kuka的答案之外,下面是如何使用npx运行带有ES模块的Jest:

"test:monitoring": "npx --node-arg=--experimental-vm-modules jest -f monitoring.test.js --detectOpenHandles",

好处是不需要提供绝对的node_modules路径。

3okqufwl

3okqufwl6#

没有Babel,这里有一个完整的、最小的例子,可以在最近的Jest版本上运行。

$ tree -I node_modules
.
├── package.json
├── src
│   └── foo.js
└── __tests__
    └── foo.spec.js

package.json

{
  "type": "module",
  "scripts": {
    "test": "NODE_OPTIONS=--experimental-vm-modules jest"
  },
  "devDependencies": {
    "jest": "^29.3.1"
  }
}

src/foo.js

export const bar = () => 42;

__tests__/foo.spec.js

import {bar} from "../src/foo";

describe("foo.bar()", () => {
  it("should return 42", () => {
    expect(bar()).toBe(42);
  });
});

秘诀在于package.json"type": "module"NODE_OPTIONS=--experimental-vm-modules jest
如果你想添加一个模拟,那就有点复杂了,参见this answer

相关问题