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

使用Jest测试TS Express应用:路由出现TypeError问题

问题:Jest测试Express API时抛出TypeError: Cannot read properties of undefined (reading 'Router')

首次使用Jest测试Express API,运行测试时在ResolutionRouter.ts中出现报错:TypeError: Cannot read properties of undefined (reading 'Router'),但应用正常运行时无此问题,且同类型的AuthenticationRouter没有报错。

相关代码如下:

主路由入口router/index.ts

import express from "express";
import ResolutionRouter from "./ResolutionRouter";
import AuthenticationRouter from "./AuthenticationRouter";

const router = express.Router();

router.use("/auth", AuthenticationRouter);
router.use("/resolution", ResolutionRouter);

export default router;

routes/ResolutionRouter.ts报错位置

import express from "express";
import * as ResolutionController from "../controllers/ResolutionController";
import authenticate, {requireRole} from "../middleware/authenticate";

const router = express.Router();  // <-- 此处抛出TypeError

// 路由定义
export default router;
解决方案
  • 先查Jest的ES模块配置:Express是ES模块,如果你的Jest还在用CommonJS的配置逻辑,import express时可能返回undefined。打开jest.config.js,确保transform里配置了ts-jest处理TypeScript文件,moduleFileExtensions包含ts;如果项目package.json里设了type: "module",Jest配置要对应改成module: "ESNext",或者调整ts-jest的预设为ts-jest/presets/default-esm。
  • 验证依赖完整性:删掉node_modules和package-lock.json重新安装,避免依赖版本不兼容或者安装损坏的问题:
    rm -rf node_modules package-lock.json
    npm install
    
  • 核对测试文件的导入路径:测试里导入ResolutionRouter的路径有没有写错,比如大小写(部分系统大小写敏感)、相对路径层级错误,这些都可能导致模块导入异常。
  • 用Mock快速排查:在测试文件里临时Mock Express,看看是不是模块导入的问题:
    jest.mock('express', () => ({
      Router: jest.fn(() => ({
        use: jest.fn(),
        get: jest.fn(),
        // 把你用到的路由方法都加上
      }))
    }));
    
    如果Mock后报错消失,那肯定是Jest的模块解析配置有问题,重点调这个。
  • 检查ResolutionRouter的导出:虽然运行时正常,但测试环境的语法解析可能更严格,确认文件里没有隐藏的语法错误,比如未闭合的括号、异步导入的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:42:37