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

如何mock express() 基于mocha测试get路由是否被正确调用

实现方案

你需要借助测试桩工具拦截express模块的调用,跟踪get方法的调用参数即可实现需求,以下是基于mocha + sinon + chai的完整实现:

依赖安装

先安装所需的测试依赖:

npm i sinon chai proxyquire -D

测试代码实现

const { expect } = require('chai')
const sinon = require('sinon')
const proxyquire = require('proxyquire')

// 提前定义测试环境的port,避免构造函数内变量未定义报错
process.env.PORT = 3000

describe('CommunicationsApplication 构造逻辑', () => {
  it('should call app.get with correct parameters', () => {
    // 构造伪造的app实例,给get、listen方法打测试桩
    const mockApp = {
      get: sinon.stub(),
      listen: sinon.stub()
    }
    // 替换express模块导出的方法,调用时直接返回伪造的app实例
    const mockExpress = sinon.stub().returns(mockApp)
    // 加载你的业务模块,将内置依赖的express替换为我们伪造的版本,注意替换下方文件名为你实际存放CommunicationsApplication的文件路径
    const { CommunicationsApplication } = proxyquire('./你的业务模块文件名', {
      express: mockExpress
    })

    // 执行构造函数,触发对应逻辑
    new CommunicationsApplication()

    // 断言验证:get方法调用参数符合预期
    expect(mockApp.get.calledOnce).to.be.true
    // 验证路径参数为/
    expect(mockApp.get.firstCall.args[0]).to.equal('/')
    // 可选:验证路由处理函数逻辑正确
    const mockRes = { send: sinon.stub() }
    mockApp.get.firstCall.args[1]({}, mockRes)
    expect(mockRes.send.calledWith('Hello World!')).to.be.true
  })
})

逻辑说明

你要求的测试流程完全对应上述代码逻辑:

  • Given:提前mock好express模块,完成测试桩初始化
  • When:执行new CommunicationsApplication()触发构造函数逻辑
  • Then:直接验证get方法的调用次数、入参是否符合预期

如果你的项目使用ES模块而非CommonJS,可以将proxyquire替换为mock-import,核心逻辑完全一致:替换express模块的导出为伪造函数,跟踪内部方法调用即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:57:02