如何在Express.js中导出app实例,适配Supertest与Superagent测试
导出Express app实例用于Supertest/Superagent测试
你需要把服务器初始化和启动监听的逻辑拆分,同时导出可被测试工具调用的app实例(或获取实例的异步方法)——因为Supertest/Superagent需要直接使用Express app对象,而非已启动的服务器进程。
修改后的app.ts代码
import express from 'express'; const port = 8080; const host = "0.0.0.0"; // 抽离创建app的异步逻辑,导出供测试调用 export const createApp = async () => { const app = express(); const middlewareA = await middlewareA(); app.use([middlewareA]); app.use(routes); return app; }; // 仅在直接运行当前文件时启动服务器,避免测试时自动监听端口 if (require.main === module) { (async () => { const app = await createApp(); app.listen(port, host, () => { console.log(`Working server on ${host}:${port}`); }); })(); }
测试文件中的使用示例(以Supertest为例)
import request from 'supertest'; import { createApp } from './app'; describe('API接口测试', () => { let app; // 测试前初始化app实例 beforeAll(async () => { app = await createApp(); }); it('测试GET接口返回状态', async () => { const response = await request(app).get('/your-test-endpoint'); expect(response.status).toBe(200); }); });
核心说明
- 用
createApp异步函数封装app的初始化逻辑并导出,确保测试代码能获取到加载完中间件和路由的完整app实例 require.main === module的判断可以避免测试时自动启动服务器监听端口,防止端口冲突- Supertest和Superagent都能直接接收这个app实例,测试工具会自动在临时端口启动服务,测试结束后自动关闭
内容的提问来源于stack exchange,提问作者spyrAlex
相关产品推荐
相关产品推荐

