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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:42:30