如何在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作用一致,能轻松替换模块中的函数并指定返回值。
实现步骤:
- 安装Sinon:
npm install sinon --save-dev
- 修改测试代码,用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
相关产品推荐
相关产品推荐

