如何监视从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
相关产品推荐
相关产品推荐

