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

