如何在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
相关产品推荐
相关产品推荐

