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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:35:10