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
相关产品推荐
相关产品推荐

