Jest mock AWS SDK时如何模拟createSecret报错覆盖catch测试分支
AWS Secrets Manager 工具函数单元测试catch块覆盖方案
核心思路
要覆盖create-secret.ts中的catch分支,只需要让mock的secretsManager.createSecret().promise()方法在对应测试用例中主动抛出异步错误,模拟AWS SDK调用失败的场景即可。
具体修改步骤
- 调整原有
aws-sdk的mock逻辑,将createSecret定义为可动态修改实现的Jest Mock函数,默认返回成功响应 - 新增错误场景测试用例,在该用例中临时覆写
createSecret的实现,让其返回reject状态的Promise - 调用被测函数,验证catch块逻辑是否正常返回捕获到的错误
完整可运行测试代码
import * as AWS from 'aws-sdk'; import { createSecretToken } from './create-secret'; // 成功场景模拟响应 const successResponse = { ARN: 'test', Name: 'testName', VersionId: 'XXX', VersionStages: ['AWSCURRENT'], }; // 模拟SDK抛出的错误 const mockCreateError = new Error('Create secret failed: duplicate secret name'); // 全局mock aws-sdk jest.mock('aws-sdk', () => { return { config: { update() { return {}; }, }, SecretsManager: jest.fn(() => { return { createSecret: jest.fn(() => ({ promise: () => Promise.resolve(successResponse), })), }; }), }; }); describe('createSecretToken', () => { // 每个用例执行前清空mock状态,避免跨用例干扰 beforeEach(() => { jest.clearAllMocks(); }); // 原有成功场景用例(覆盖try块) it('should return secret metadata when create secret succeeds', async () => { const secretsManagerConstructorSpy = jest.spyOn(AWS, 'SecretsManager'); const result = await createSecretToken('test', 'test'); expect(secretsManagerConstructorSpy).toHaveBeenCalledTimes(1); expect(result).toEqual(successResponse); }); // 新增错误场景用例(覆盖catch块) it('should return caught error when create secret call fails', async () => { // 获取mock的SecretsManager实例 const MockSecretsManager = AWS.SecretsManager as jest.MockedClass<typeof AWS.SecretsManager>; // 获取实例上的createSecret mock方法 const mockCreateSecret = MockSecretsManager.mock.instances[0].createSecret as jest.Mock; // 覆写一次createSecret的实现,让其返回reject的Promise模拟调用失败 mockCreateSecret.mockImplementationOnce(() => ({ promise: () => Promise.reject(mockCreateError) })); const result = await createSecretToken('duplicateSecret', 'testToken'); // 验证返回值是catch块捕获到的错误 expect(result).toEqual(mockCreateError); // 可选:验证入参传递正确 expect(mockCreateSecret).toHaveBeenCalledWith({ Description: 'Store token', Name: 'duplicateSecret', SecretString: 'testToken' }); }); });
额外注意
你贴出的create-secret.ts代码里有一处TS语法笔误,函数定义处多写了等号:
// 错误写法 export const createSecretToken = async (secretId: string,token: string,): Promise<any> ={ // 正确写法(把=改成=>) export const createSecretToken = async (secretId: string,token: string): Promise<any> => {
修正后业务代码和测试代码都可以正常运行,运行测试后可以看到catch块已经被完全覆盖。
内容的提问来源于stack exchange,提问作者SCodes
相关产品推荐
相关产品推荐

