如何在Node中创建虚拟HTTP请求与响应对象用于单元测试
测试Express请求处理函数的Jest单元测试方案
你可以通过手动模拟请求(req)和响应(res)对象完成单元测试,核心是用Jest的模拟函数捕获res对象的方法调用,验证逻辑是否符合预期。
步骤1:构造模拟的req和res对象
你的homepageHandler没有使用req的任何属性,所以req可以是一个空对象;res需要模拟status()和json()方法,因为handler里用到了链式调用,要让status()返回res自身:
const indexControllerModule = require('./path/to/your/controller'); // 替换为你的文件实际路径 describe("Endpoints are accessible", () => { it("GET request for homepage should return 200 and correct message", () => { // 模拟req对象(若后续需测试query/params,可添加对应属性) const req = {}; // 模拟res对象,用Jest mock函数捕获方法调用 const res = { status: jest.fn().mockReturnThis(), // 链式调用需返回自身 json: jest.fn() }; // 调用待测试的handler indexControllerModule.indexExports.homepageHandler(req, res); // 验证status方法是否传入了200 expect(res.status).toHaveBeenCalledWith(200); // 验证json方法是否传入了正确的响应体 expect(res.json).toHaveBeenCalledWith({ message: "welcome" }); }); });
关键说明
jest.fn().mockReturnThis():模拟Express中res.status()的行为,因为该方法会返回res对象本身,才能支持链式调用.json()。- 无需
async/await或.then():你的homepageHandler是同步函数,直接调用即可完成测试。 - 若后续需测试req的属性(如
req.query、req.params),只需给模拟的req对象添加对应属性,例如:const req = { query: { id: '123' } }。
可选:用专用库简化模拟
如果需要模拟更复杂的req/res行为(如res.send()、req.headers等),可以用jest-mock-express库,它封装了常用的Express请求响应对象模拟:
const { mockRequest, mockResponse } = require('jest-mock-express'); describe("Endpoints are accessible", () => { it("GET request for homepage should return 200", () => { const req = mockRequest(); const res = mockResponse(); indexControllerModule.indexExports.homepageHandler(req, res); expect(res.status).toHaveBeenCalledWith(200); expect(res.json).toHaveBeenCalledWith({ message: "welcome" }); }); });
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

