运行js测试-获取“无法在模块外部使用import语句”

时间:2020-05-03 13:50:49

标签: javascript jestjs mocha babeljs

我添加了type: module,但这没有帮助。

我试图运行将importexport用于源文件的摩卡或开玩笑的测试。

关于此问题的现有问题与我的问题有所不同,我也发现这些问题使我难以理解我的具体情况,尤其是因为我制定了具体的答案,其细节与现有问题无关,但与我遇到的其他人。

3 个答案:

答案 0 :(得分:5)

对于每个the Jest documentation,如果您确定已安装babel-jest并在配置文件或package.json中按the Babel documentation提供您的Babel配置,例如:

.babelrc.json

{
  "presets": [
    "@babel/env"
  ]
}

然后babel-jest将自动将其拾取,您无需显式地预先构建文件即可对其进行测试。这也意味着您在调用Babel时不必在命令行上设置标志。


请注意,如果您要做要明确地进行预构建,则建议:

  1. 使用pre<script>脚本,而不是一行包含多个步骤;和
  2. 重新使用build脚本,这样您就不必在两个地方进行更改。

在您的情况下:

"scripts": {
  "build": "babel src/ --out-dir lib",
  "pretest": "npm run build",
  "test": "jest lib/*.test.js"
}

答案 1 :(得分:5)

过去,如果不使用Babel编译代码,则无法在Node中使用ES模块(即import / export)。但是,现在已经可以在Node中支持ES模块了,Jest和Mocha最近都增加了对本机使用ES模块的支持。

不过,这不仅仅是将"type": "module"添加到您的 package.json 中。

在Jest中使用本机ES模块的步骤

  1. 如上所述,将"type": "module"添加到您的 package.json

  2. jest-environment-nodejest-environment-jsdom-sixteen安装到您的开发依赖项中。例如:

    $ npm i -D jest-environment-node
    
  3. 更新 package.json 中的Jest配置并添加testEnvironment设置。例如:

    "jest": {
        "testEnvironment": "jest-environment-jsdom-node"
    }
    
  4. 如果使用的Node版本早于13.2,则在运行Node时需要添加两个附加标志:--experimental-modulesexperimental-vm-modules。我使用npx执行命令,尽管有点冗长:

    $ npx --node-arg=--experimental-modules --node-arg=--experimental-vm-modules jest
    

这将使用适当的Node标志运行所有的Jest测试。如果这样做的话,建议您在test中将此脚本设为package.json脚本。

现在,您应该可以在没有Babel的情况下使用import / export

最后一个要点:在Node中使用本机ES模块时,必须使用本地文件的完整导入路径,包括文件扩展名。例如:

import lib from "./my/lib.js"

如果您想详细了解以下内容,请查看原生ES模块上的Node文档:https://nodejs.org/dist/latest-v14.x/docs/api/esm.html

我还建议阅读Github问题,以获取有关本机ES模块的Jest实现的更多详细信息:https://github.com/facebook/jest/issues/9430

答案 2 :(得分:3)

运行测试时,您需要使用编译器,然后使用编译的文件。

许多参考文献都说要添加type: module,但不要多说。
要明确的是,基本信息:

SyntaxError: Cannot use import statement outside a module

是因为您使用的是import / export,而您正试图直接运行文件而不进行编译。

这里的思想转变已习惯于在一个目录中编辑文件并在另一个目录中运行测试。另外,某些解决方案提供“运行中”编译,因此该详细信息实际上是隐藏的,仅使用源文件。

根据特定需求,有几种不同的方法可以执行此操作。这是我到目前为止发现的最简单的方法之一,使用Babel进行编译:

  • 安装babel npm install babel --save-dev
  • package.json脚本中添加babel命令,例如:

    "scripts": {
      "test": "babel src/ --out-dir lib --presets=@babel/env; jest lib/*.test.js",
      "build": "babel src/ --out-dir lib --presets=@babel/env"
    },  // this was for jest but you can use mocha, etc as needed
        // Note that using preset this way eliminates the need for a specific .babel.config.json file
    

现在,如果您运行:

jest .

您得到SyntaxError: Cannot use import statement outside a module,但是如果您运行npm t您将得到

Successfully compiled 2 files with Babel.
 PASS  lib/app.test.js
  All tests
    ✓ Canary test (2ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total

前进,只记得:

  • src/中编辑文件
  • lib/中运行测试