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

如何监视从node_modules导入的命名类Mock的函数调用?

解决作用域包中MyS3Service构造函数调用参数的监视问题

首先修正你mock代码里的一个笔误:目标类是MyS3Service,但原mock导出里写的是S3Service,这会导致mock没有正确替换目标类,先把这个问题修正。

要监视构造函数的调用参数,核心是确保你的jest mock函数被正确关联到目标模块的导出,再通过jest的mock函数API获取调用信息。

步骤1:修正Mock定义与导出

调整你的mock辅助函数和jest.mock代码:

// 修正mock名称,和目标类保持一致
export const MyS3ServiceMock = jest.fn().mockImplementation(() => {
  return {
    getListOfFiles: jest.fn(() => Promise.resolve({ status: 'OK' }))
  };
});

// 直接mock作用域包,无需写node_modules路径
jest.mock('@my-company/common', () => {
  const originalModules = jest.requireActual('@my-company/common');
  return {
    __esModule: true,
    ...originalModules,
    MyS3Service: MyS3ServiceMock, // 确保导出名称和目标类一致
  };
});

步骤2:在测试用例中获取构造函数调用参数

初始化MyAwsService后,通过MyS3ServiceMock.mock.calls即可获取构造函数的调用参数:

import { MyAwsService } from './my-aws.service';
import { ConfigService } from '@nestjs/config';
import { MyS3ServiceMock } from './mocks/s3.service.mock';

describe('MyAwsService', () => {
  let service: MyAwsService;
  let configService: ConfigService;

  beforeEach(() => {
    // 重置mock调用记录,避免用例间污染
    MyS3ServiceMock.mockClear();
    
    configService = new ConfigService({
      region: 'us-east-1',
      key: 'test-key',
      secret: 'test-secret'
    });
    service = new MyAwsService(configService);
  });

  it('should initialize MyS3Service with correct configuration', () => {
    // 获取构造函数第一次调用的第一个参数
    const constructorArgs = MyS3ServiceMock.mock.calls[0][0];
    
    expect(constructorArgs.region).toBe('us-east-1');
    expect(constructorArgs.credentials.accessKeyId).toBe('test-key');
    expect(constructorArgs.credentials.secretAccessKey).toBe('test-secret');
  });

  it('should call getListOfFiles correctly', async () => {
    // 假设MyAwsService有调用getListOfFiles的方法
    await service.someMethodThatCallsGetList();
    
    // 通过mock实例监视方法调用
    expect(MyS3ServiceMock.mock.instances[0].getListOfFiles).toHaveBeenCalled();
  });
});

关键说明

  • mock.calls是二维数组,每一项对应一次函数调用,子数组为调用时传入的参数,mock.calls[0][0]即第一次构造函数调用的第一个参数。
  • mock.instances保存所有通过new创建的mock实例,可用于监视实例方法的调用。
  • 每次测试前调用mockClear(),清空mock的调用记录和实例,避免不同测试用例间的干扰。

内容的提问来源于stack exchange,提问作者Naryck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:29:36