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

如何在Mocha+Chai测试中像Python unittest.mock.patch一样Mock函数?

问题描述

我在项目中使用Chai、Mocha进行测试,需测试tree.js模块中的createTreefromFolder函数:

export function createTreefromFolder(path: string): string[] {
  const files = listFilesFromFolder(path);
  const tree: string[] = [createFirstBranch(path)];
  files.forEach((file) => {
    tree.push(Prefix.VERTICAL.concat(file));
  });
  return tree;
}

我的目标是在测试中MocklistFilesFromFolder函数,使其返回指定值。测试文件夹中的代码如下:

it("creation of a unique folder tree", () => {
  const expectedArray: string[] = ["🗃️ empty_folder"];
  mock("src.tree.listFilesFromFolder").return_value = ["empty_folder"] // mock here
  expect(createTreefromFolder(empty_test_folder_path)).to.eql(expectedArray);
});

请问是否存在类似Python中unittest.mock.patch的实现方式?

解决方案

有,在Mocha+Chai的测试生态里,Sinon.js的stub功能和Python的unittest.mock.patch作用一致,能轻松替换模块中的函数并指定返回值。

实现步骤:

  1. 安装Sinon:
npm install sinon --save-dev
  1. 修改测试代码,用Sinon Stub目标函数:
import sinon from 'sinon';
import { createTreefromFolder } from '../src/tree';
import * as treeModule from '../src/tree';

it("creation of a unique folder tree", () => {
  const expectedArray: string[] = ["🗃️ empty_folder"];
  // 替换tree模块里的listFilesFromFolder,指定返回值
  const listFilesStub = sinon.stub(treeModule, 'listFilesFromFolder').returns(["empty_folder"]);
  
  expect(createTreefromFolder(empty_test_folder_path)).to.eql(expectedArray);
  
  // 测试结束后恢复原函数,避免干扰其他测试用例
  listFilesStub.restore();
});

补充说明:

  • 若目标函数是异步的,可改用resolves方法指定返回的Promise结果;要模拟报错则用throws。
  • 复杂场景下也可以用proxyquire来替换模块依赖,但Sinon Stub足以覆盖大部分常规Mock需求。

内容的提问来源于stack exchange,提问作者Pi-R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:50:28