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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:42:17