如何在Jest中正确Mock simple-git库(NestJS场景)
如何正确Mock simple-git库以测试NestJS应用中的Git操作
你的问题出在Mock的结构和断言方式上,以下是两种可行的修正方案:
方案一:单独提取Mock实例(推荐)
这种方式更清晰,便于测试中直接引用Mock对象做断言:
import myFunction from './my-module'; import simpleGit from 'simple-git'; // 定义Mock的Git实例,包含你需要模拟的方法 const mockGit = { checkout: jest.fn(), init: jest.fn(), addConfig: jest.fn(), fetch: jest.fn(), pull: jest.fn(), checkIsRepo: jest.fn(), }; // Mock simple-git的默认导出:返回mockGit的函数 jest.mock('simple-git', () => jest.fn(() => mockGit)); describe('myFunction', () => { // 每次测试前清空Mock调用记录,避免测试间污染 beforeEach(() => { jest.clearAllMocks(); }); it('should call checkout with "my-branch"', () => { myFunction(); // 直接断言Mock的checkout方法被正确调用 expect(mockGit.checkout).toHaveBeenCalledWith('my-branch'); // 也可以用更严格的断言:确保只被调用一次 expect(mockGit.checkout).toHaveBeenCalledTimes(1); }); });
方案二:修正原有Mock结构
如果你想保留原有Mock的写法,只需调整Mock的导出结构,并修正断言逻辑:
import myFunction from './my-module'; import simpleGit from 'simple-git'; jest.mock('simple-git', () => { const mGit = { init: jest.fn(), checkout: jest.fn(), addConfig: jest.fn(), fetch: jest.fn(), pull: jest.fn(), checkIsRepo: jest.fn(), }; // 直接返回Mock函数作为默认导出,无需额外导出SimpleGit(除非你的代码用到了它) return jest.fn(() => mGit); }); describe('myFunction', () => { beforeEach(() => { jest.clearAllMocks(); }); it('should call checkout with the correct branch', () => { myFunction(); // 获取Mock的Git实例,断言其checkout方法的调用 const mockGitInstance = simpleGit(); expect(mockGitInstance.checkout).toHaveBeenCalledWith('my-branch'); }); });
关键注意点
- Mock匹配导出结构:你的业务代码使用的是
simple-git的默认导出(import simpleGit from 'simple-git'),所以Mock时只需确保默认导出是返回Mock实例的函数即可,无需额外处理Named Export(除非你的代码用到了SimpleGit类)。 - 清空Mock记录:每次测试前调用
jest.clearAllMocks()可以避免不同测试用例之间的调用记录干扰。 - 直接断言Mock方法:不要通过
simpleGit().checkout重复调用Mock构造函数来断言,直接引用已定义的Mock实例或其返回的对象更可靠。
内容的提问来源于stack exchange,提问作者SamHoque
相关产品推荐
相关产品推荐

