使用Mocha和Sinon进行TypeScript路由单元测试入门求助
使用Sinon和Mocha测试Express路由控制器
我刚接触单元测试,希望用Sinon和Mocha对我的Express路由控制器进行单元测试。我的控制器代码如下:
import { NextFunction, Request, Response, Router } from 'express'; export default class Sample { constructor(a: string) { console.error('constructor',a); } public getAll(req: Request, res: Response, next: NextFunction) { res.json('OK'); } }
目前我只写了测试代码的开头部分,还不知道怎么完成完整的测试逻辑:
import { expect } from 'chai'; import 'mocha'; import * as sinon from 'sinon'; import Sample from '../path/to/Sample'; // 替换为实际文件路径
完整的测试实现思路
刚接触单元测试的话,咱们聚焦核心就行:测试getAll方法是否正确调用了res.json并传入预期值。不需要启动真实Express服务,用Sinon模拟出req、res、next这三个Express对象就足够了。
下面是完整的测试代码:
import { expect } from 'chai'; import 'mocha'; import * as sinon from 'sinon'; import Sample from '../path/to/Sample'; describe('Sample Controller', () => { describe('getAll method', () => { it('should call res.json with "OK"', () => { // 1. 创建模拟的Express对象 const req = {} as Request; const res = { json: sinon.stub() // 用Sinon创建存根,追踪res.json的调用情况 } as unknown as Response; const next = sinon.stub() as NextFunction; // 2. 实例化控制器(构造函数需要字符串参数,随便传个测试值即可) const sampleController = new Sample('test-init-param'); // 3. 调用要测试的getAll方法 sampleController.getAll(req, res, next); // 4. 断言验证方法行为是否符合预期 expect(res.json.calledOnce).to.be.true; expect(res.json.calledWith('OK')).to.be.true; // 额外验证:如果业务逻辑里不会调用next,就确认它没被触发 expect(next.called).to.be.false; }); }); });
关键步骤说明
- 模拟对象:用Sinon的
stub创建res.json和next的存根,这样我们能精准追踪这些方法的调用次数、传入参数,完全脱离真实Express环境。 - 控制器实例化:构造函数的参数只是初始化用,测试时传任意合法值就行,咱们的测试焦点在
getAll方法上。 - 断言验证:通过Chai的
expect语法,确认存根的调用情况和预期一致,确保方法逻辑正确。
这样就能完成对getAll方法的单元测试啦~
内容的提问来源于stack exchange,提问作者TLR
相关产品推荐
相关产品推荐

