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

Jest测试:如何验证ApiKeyManager类的getApiKey方法被调用?

解决Jest中验证模拟类方法调用的问题

要验证getApiKey方法的调用情况,你需要先把该方法改成Jest模拟函数,再获取类实例来断言调用次数,具体步骤如下:

1. 修改ApiKeyManager的模拟实现

将原mock中的getApiKey替换为Jest模拟函数,这样才能跟踪它的调用记录:

import {ApiKeyManager} from '../../api_key_manager_client/api_key_manager';

jest.mock('../../api_key_manager_client/api_key_manager', () => {
  return {
    ApiKeyManager: jest.fn().mockImplementation(() => {
      return {
        secretId: 'WEBHOOKS_API_KEY',
        // 改成jest模拟函数并指定返回值
        getApiKey: jest.fn().mockReturnValue('xxx'),
      };
    }),
  };
});

2. 在测试用例中添加调用断言

通过ApiKeyManager这个模拟构造函数的mock.instances属性,获取到创建的类实例,然后对实例上的getApiKey方法做调用次数断言:

it('should run the callback endpoint class when the given API key matches', async () => {
    const payload = {...};
    const res = await request(app)
        .post('/callback')
        .set({'X-API-KEY': 'xxx', 'Accept': 'application/json', 'Content-Type': 'application/json'})
        .send(payload);
    
    expect(res.statusCode).toEqual(201);
    expect(ApiKeyManager).toHaveBeenCalledTimes(1);
    
    // 获取ApiKeyManager的实例
    const apiKeyManagerInstance = (ApiKeyManager as jest.Mock).mock.instances[0];
    // 断言getApiKey被调用一次
    expect(apiKeyManagerInstance.getApiKey).toHaveBeenCalledTimes(1);
  });

说明

  • (ApiKeyManager as jest.Mock)是TypeScript的类型断言,因为原类型是类,被mock后实际是Jest模拟函数,需要断言类型才能访问mock相关属性。
  • mock.instances存储了所有通过new ApiKeyManager()创建的实例,这里取第一个([0])即可,因为你已经断言了类只被实例化一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:23:15