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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:06:30