拓展 - 03 - jest 测试 jest1. 安装依赖npminstall-Djest types/jest ts-jest supertest types/supertest cross-env包作用jest测试框架跑测试、组织用例、断言、mocktypes/jest让 TS 识别describe、it、expect等全局 APIts-jest让 Jest 直接运行.ts文件无需先编译成 JSsupertest对 Express 发 HTTP 请求并检查响应无需浏览器/Postmantypes/supertestsupertest 的 TS 类型cross-env跨平台设置环境变量Windows 也能写NODE_ENVtest缺了会怎样无 jest → 没有测试框架无 ts-jest → Jest 跑不了.ts无 types/* → 写测试时 TS 报类型错误无 supertest → 不方便测 HTTP 接口无 cross-env → Windows 上环境变量写法可能失效2. 运行npm test时发生了什么npm test → cross-env 设置 NODE_ENVtest → node 启动 JestESM 需 --experimental-vm-modules → 读取 jest.config.cjs → 先执行 tests/setup.ts → 找到 tests/*.test.ts → ts-jest 编译 TypeScript → supertest 向 Express 发请求 → expect 断言 → 输出 PASS / FAIL3. 各文件职责文件职责package.json→test一键启动测试的命令jest.config.cjs告诉 Jest 跑哪些文件、怎么编译 TS、路径怎么映射tests/setup.ts每个测试运行前的公共初始化tests/*.test.ts具体测试用例tsconfig.jsonTS 编译规则 Jest 类型支持index.ts被测的 Express 应用测试时不 listen只 export4. package.json — test 命令test:cross-env NODE_ENVtest node --experimental-vm-modules node_modules/jest/bin/jest.js片段含义cross-env NODE_ENVtest设为测试模式index.ts 里据此跳过app.listen()node --experimental-vm-modules项目type: moduleESMJest 需要此开关jest/bin/jest.jsJest 入口index.ts相关逻辑if(process.env.NODE_ENV!test){app.listen(PORT,...);// 正常启动才监听端口}exportdefaultapp;// 测试时导出 app 给 supertest 用5. jest.config.cjs — Jest 配置用.cjs是因为项目是 ESM避免和type: module冲突。配置含义preset: ts-jest/presets/default-esmts-jest 的 ESM 预设testEnvironment: node在 Node 环境跑测后端 APIextensionsToTreatAsEsm: [.ts]把.ts当 ESM 模块moduleNameMapper路径映射../index.ts和/xxx能被正确解析transformuseESM: true用 ts-jest 编译 TS按 ESM 处理setupFiles: [tests/setup.ts]每个测试前先跑 setuptestMatch: [**/tests/**/*.test.ts]只跑 tests 目录下.test.ts文件6. tests/setup.ts — 测试前准备importdotenv/config;// 加载 .env数据库地址等process.env.NODE_ENVtest;// 确保测试模式7. tests/health.test.ts — 示例用例importrequestfromsupertest;importappfrom../index.ts;describe(Get /health,(){// 一组相关测试it(returns 200 and status ok,async(){// 一个具体场景constresawaitrequest(app).get(/health);expect(res.status).toBe(200);expect(res.body).toEqual({status:ok,message:API is running});});});API作用describe分组把相关测试包在一起it一个测试用例request(app).get(...)supertest 模拟 HTTP 请求expect(...).toBe(...)断言不符合预期则 FAIL8. tsconfig.json — 测试相关项types:[node,jest]// 加载 Jest 全局类型否则 describe/expect 报错baseUrlpaths// 路径别名 /* → src/*ignoreDeprecations:6.0// TS6 中 baseUrl 已弃用加此项消除编译报错IDE 若报ignoreDeprecations值无效Cursor 内置 TS5 不认识6.0。CtrlShiftP → TypeScript: Select TypeScript Version → Use Workspace Version即可。.vscode/settings.json已配置typescript.tsdk: node_modules/typescript/lib指向项目 TS 版本。9. 依赖协作关系npm test ├── cross-env → NODE_ENVtest ├── jest → 找测试、跑测试、输出结果 ├── ts-jest → 编译 .ts读 tsconfig.json ├── types/jest → describe/it/expect 类型 ├── supertest → 对 app 发 HTTP 请求 └── types/supertest → request() 类型