返回

深入剖析 Jest 测试框架中的 Cannot use import statement outside a module 错误及终极解决方案

前端







**导言** 

Jest 是一个流行的 JavaScript 单元测试框架,因其易用性、灵活性以及与各种 JavaScript 框架和库的兼容性而备受青睐。然而,在使用 Jest 进行测试时,您可能会遇到“Cannot use import statement outside a module”错误。此错误通常是由使用 ES modules(又称 ESM)模块导致的,这是一种新的模块化系统,在现代 JavaScript 中得到了广泛应用。

**问题根源** 

为了理解“Cannot use import statement outside a module”错误,我们需要了解 ES modules 的工作原理。ES modules 使用 importexport 语句来定义和使用模块中的变量和函数。这些语句只能在模块中使用,而不能在普通脚本文件中使用。

当使用 Jest 进行测试时,Jest 会将测试文件视为普通脚本文件。因此,如果您在测试文件中使用了 ES modules 中的 import 语句,Jest 就会抛出“Cannot use import statement outside a module”错误。

**解决方案** 

要解决“Cannot use import statement outside a module”错误,您需要将测试文件转换为 ES module。有以下几种方法可以实现:

1. 使用 Babel 或 TypeScript 编译器将您的测试文件转换为 ES5 代码。ES5 代码是一种旧版本的 JavaScript,不包含 ES modules 的语法。这样,Jest 就可以正确地解析您的测试文件,而不会出现错误。

2. 使用 Jest 的 --module 参数指定要使用的模块化系统。例如,您可以使用 --module=esnext 参数来指定使用 ES modules。这样,Jest 会将您的测试文件视为 ES module,并正确地解析其中的 import 语句。

3. 使用 Jest 的 transform 选项指定要使用的转换器。转换器是一种工具,可以将一种格式的代码转换为另一种格式的代码。例如,您可以使用 jest-transform-esm 转换器将 ES modules 代码转换为 ES5 代码。这样,Jest 就可以正确地解析您的测试文件,而不会出现错误。

**示例** 

以下是一个使用 Babel 编译器将测试文件转换为 ES5 代码的示例:

// package.json
{
"scripts": {
"test": "babel --presets=es2015 test/index.js | jest"
}
}


// test/index.js
import { add } from "../src/math";

test("adds 1 + 2 to equal 3", () => {
expect(add(1, 2)).toBe(3);
});


当您运行 npm test 命令时,Babel 编译器会将 test/index.js 文件转换为 ES5 代码,然后 Jest 会运行测试。

**总结** 

在 Jest 单元测试框架中,“Cannot use import statement outside a module”错误通常是由使用 ES modules 导致的。为了解决此错误,您可以将测试文件转换为 ES module,可以使用 Babel 或 TypeScript 编译器、Jest 的 --module 参数或 Jest 的 transform 选项来实现。通过这些方法,您可以轻松解决错误,继续畅通无阻地进行测试。