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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:50