使用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,看看是不是模块导入的问题:
如果Mock后报错消失,那肯定是Jest的模块解析配置有问题,重点调这个。jest.mock('express', () => ({ Router: jest.fn(() => ({ use: jest.fn(), get: jest.fn(), // 把你用到的路由方法都加上 })) })); - 检查
ResolutionRouter的导出:虽然运行时正常,但测试环境的语法解析可能更严格,确认文件里没有隐藏的语法错误,比如未闭合的括号、异步导入的问题。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

