You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+TypeScript项目Jest报错:Cannot use import statement outside a module

解决Jest测试中"Cannot use import statement outside a module"报错问题

问题背景

使用React+TypeScript开发项目,测试Header组件时编写了如下测试代码:

test("Render Header", () => {
  render(<Header />);
});

Header组件会调用actions.tsx中的异步action creator loadRepo(该方法基于axios实现):

import { loadRepo } from "../../redux/actions";
dispatch(loadRepo());

运行测试时触发报错:Cannot use import statement outside a module,根源是actions.tsx中导入axios时,Jest无法正确解析其ES模块语法。

已配置的文件内容如下:

babel.config.js

module.exports = {
  presets: [["@babel/preset-env", { targets: { node: "current" } }], "@babel/preset-react", "@babel/preset-typescript"],
  plugins: [],
};

jest.config.js

module.exports = {
  setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect"],
  moduleNameMapper: {
    "\\.(css|less|scss|sass)$": "identity-obj-proxy",
  },
  transform: {
    "^.+\\.(js|jsx|ts|tsx)$": "babel-jest",
  },
};

package.json

"dependencies": {
    "@testing-library/user-event": "^13.5.0",
    "@types/node": "^16.18.23",
    "@types/react": "^18.0.35",
    "@types/react-dom": "^18.0.11",
    "axios": "^1.3.5",
    "bootstrap": "^5.2.3",
    "react": "^18.2.0",
    "react-bootstrap": "^2.7.3",
    "react-dom": "^18.2.0",
    "react-redux": "^8.0.5",
    "react-scripts": "5.0.1",
    "redux": "^4.2.1",
    "redux-thunk": "^2.4.2",
    "typescript": "^4.9.5",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "devDependencies": {
    "@babel/core": "^7.21.4",
    "@babel/preset-env": "^7.21.4",
    "@babel/preset-react": "^7.18.6",
    "@babel/preset-typescript": "^7.21.4",
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^14.0.0",
    "babel-jest": "^29.5.0",
    "jest": "^27.5.1"
  }

解决方案

1. 调整Jest配置,兼容axios的ES模块

修改jest.config.js,让Jest正确转译axios模块:

module.exports = {
  setupFilesAfterEnv: ["@testing-library/jest-dom/extend-expect"],
  moduleNameMapper: {
    "\\.(css|less|scss|sass)$": "identity-obj-proxy",
    'axios': require.resolve('axios')
  },
  transform: {
    "^.+\\.(js|jsx|ts|tsx)$": "babel-jest",
    "^.+\\.js$": "<rootDir>/node_modules/babel-jest"
  },
  transformIgnorePatterns: [
    "/node_modules/(?!axios)/"
  ]
};

2. 模拟异步Action Creator,避免实际调用axios

组件渲染测试无需发起真实请求,直接模拟loadRepo方法即可:

import { loadRepo } from "../../redux/actions";
// 模拟整个actions模块
jest.mock("../../redux/actions", () => ({
  loadRepo: jest.fn()
}));

test("Render Header", () => {
  render(<Header />);
  // 可选:验证loadRepo是否被调用
  expect(loadRepo).toHaveBeenCalled();
});

3. 修复依赖版本冲突

react-scripts 5.0.1自带Jest 27,但你手动安装了babel-jest 29.5.0,版本不匹配会导致转译异常:

  • 执行命令删除冲突依赖:
npm uninstall jest babel-jest
  • 依赖react-scripts自带的测试工具,确保Babel配置与react-scripts兼容

4. 确认Babel配置有效性

保持babel.config.js的preset配置正确,确保针对Node环境转译:

module.exports = {
  presets: [
    ["@babel/preset-env", { targets: { node: "current" } }],
    "@babel/preset-react",
    "@babel/preset-typescript"
  ],
  plugins: []
};

内容的提问来源于stack exchange,提问作者Vitaly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:23:15