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

如何在Mocha测试Express应用时启动服务器?VS中单元测试实现

测试Express首页的Mocha实战指南

我太懂你了——那些只会测试5===5的教程根本帮不上忙,咱们直接来搞真实场景:测试你的Express应用首页,同时搞定服务器启动的问题,全程用Mocha+SuperTest(这俩搭配是Express测试的黄金组合)。

第一步:调整项目结构,让测试能控制服务器

首先得改造你的Express入口文件,不要直接在入口里启动服务器,而是把app实例导出,这样测试工具能自己管理服务器的启停,避免端口冲突。

改造app.js(你的Express核心文件)

原来的代码可能是这样的:

const express = require('express');
const app = express();

// 首页路由
app.get('/', (req, res) => {
  res.send('<h1>我的应用首页</h1><p>这是我要测试的特定内容</p>');
});

// 直接启动服务器(测试时不要这么做)
app.listen(3000, () => {
  console.log('服务器跑在3000端口');
});

改成这样:

const express = require('express');
const app = express();

// 首页路由不变
app.get('/', (req, res) => {
  res.send('<h1>我的应用首页</h1><p>这是我要测试的特定内容</p>');
});

// 导出app实例,供测试和启动脚本使用
module.exports = app;

新建server.js(专门用来启动服务器)

创建一个单独的文件来启动服务器,这样正常运行和测试互不干扰:

const app = require('./app');

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`服务器跑在${PORT}端口`);
});

现在启动应用用npm start(记得在package.json里配置"start": "node server.js"),测试时直接用导出的app实例就行。

第二步:安装必要的测试依赖

打开终端,安装Mocha(测试框架)和SuperTest(模拟HTTP请求的工具,自动管理服务器):

npm install mocha supertest --save-dev

如果你习惯用Chai断言库代替Node内置的assert,也可以装一下:

npm install chai --save-dev

第三步:编写首页测试用例

在项目根目录创建test文件夹,里面新建homepage.test.js,这就是你的测试文件:

用Node内置assert的版本

const request = require('supertest');
const app = require('../app');
const assert = require('assert');

// 测试套件:首页相关测试
describe('首页测试', () => {
  // 单个测试用例:检查首页响应和内容
  it('应该返回200状态码,并且包含指定的首页内容', async () => {
    // 用SuperTest发送GET请求到首页
    const response = await request(app).get('/');

    // 断言状态码是200
    assert.strictEqual(response.statusCode, 200);
    // 断言响应HTML里包含标题
    assert.ok(response.text.includes('<h1>我的应用首页</h1>'));
    // 断言响应HTML里包含特定段落内容
    assert.ok(response.text.includes('这是我要测试的特定内容'));
  });
});

用Chai断言的版本(可选)

如果你更喜欢Chai的链式语法:

const request = require('supertest');
const app = require('../app');
const { expect } = require('chai');

describe('首页测试', () => {
  it('应该返回200状态码,并且包含指定的首页内容', async () => {
    const response = await request(app).get('/');

    expect(response.statusCode).to.equal(200);
    expect(response.text).to.include('<h1>我的应用首页</h1>');
    expect(response.text).to.include('这是我要测试的特定内容');
  });
});

第四步:配置并运行测试

在package.json里添加测试脚本:

"scripts": {
  "start": "node server.js",
  "test": "mocha test/**/*.test.js"
}

然后运行测试:

npm test

你会看到Mocha输出测试结果,如果首页内容符合预期,测试就会通过!

关键说明

  • 为什么用SuperTest? 它会自动帮你启动Express服务器,测试结束后自动关闭,完全不用你手动处理端口、启停逻辑,还能避免多个测试用例之间的端口冲突。
  • 如果用模板引擎(EJS/Pug)怎么办? 测试逻辑完全一样!不管你是直接send HTML还是渲染模板,SuperTest拿到的都是最终返回给浏览器的HTML,只要断言里面的内容就行。
  • ES模块支持? 如果你的项目用import/export而不是require,只要在package.json里加"type": "module",然后把代码里的require换成import就行,测试逻辑不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:08:55