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

如何用aws-sdk-client-mock在TypeScript中测试SSM GetParameter

可以用aws-sdk-client-mock为SSM GetParameterCommand编写TypeScript测试用例

当然可以用aws-sdk-client-mock来模拟SSM客户端的行为,无需调用真实AWS服务。先修正你代码里的一处明显错误:你定义了paramconfig但创建命令时用了未声明的input变量,需要改成new GetParameterCommand(paramconfig),否则代码无法正常运行。

1. 安装必要依赖

需要安装测试框架、mock工具及对应TypeScript类型:

npm install --save-dev aws-sdk-client-mock jest @types/jest ts-jest typescript

2. 完整测试用例示例

假设你的业务代码文件名为ssm-service.ts,测试文件命名为ssm-service.test.ts:

测试文件代码

import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";
import { mockClient } from "aws-sdk-client-mock";
import { fetchParam } from "./ssm-service";

// 初始化SSM客户端的mock实例
const ssmMock = mockClient(SSMClient);

describe("fetchParam 函数测试", () => {
  // 每次测试前重置mock状态,避免测试间互相干扰
  beforeEach(() => {
    ssmMock.reset();
  });

  test("获取未加密参数成功", async () => {
    // 定义mock返回的参数值
    const mockValue = "test-unencrypted-param";
    // 配置mock:当收到GetParameterCommand调用时,返回预设结果
    ssmMock.on(GetParameterCommand).resolves({
      Parameter: {
        Value: mockValue,
        Name: "/test/public-param",
        Type: "String"
      }
    });

    // 调用待测试函数
    const result = await fetchParam("/test/public-param", false);

    // 断言结果正确
    expect(result).toBe(mockValue);
    // 断言命令被正确调用,参数符合预期
    expect(ssmMock.calls()).toHaveLength(1);
    expect(ssmMock.commandCalls(GetParameterCommand)[0].args[0].input).toEqual({
      Name: "/test/public-param",
      WithDecryption: false
    });
  });

  test("获取加密参数成功", async () => {
    const mockDecryptedValue = "test-decrypted-secret";
    ssmMock.on(GetParameterCommand).resolves({
      Parameter: {
        Value: mockDecryptedValue,
        Name: "/test/secret-param",
        Type: "SecureString"
      }
    });

    const result = await fetchParam("/test/secret-param", true);

    expect(result).toBe(mockDecryptedValue);
    expect(ssmMock.commandCalls(GetParameterCommand)[0].args[0].input.WithDecryption).toBe(true);
  });

  test("处理参数不存在的错误场景", async () => {
    // 配置mock:模拟参数不存在的错误
    ssmMock.on(GetParameterCommand).rejects(new Error("ParameterNotFound"));

    await expect(fetchParam("/non-existent/param", false)).rejects.toThrow("ParameterNotFound");
  });
});

3. 修正后的业务代码

import { SSMClient, GetParameterCommand } from "@aws-sdk/client-ssm";

const region = "us-east-1"
const awsSSMClient = new SSMClient({ region })

export async function fetchParam(parameterName: string, decrypt: boolean): Promise<string> {
    const paramconfig = {
        Name: parameterName,
        WithDecryption: decrypt
    }

    // 修正:使用定义好的paramconfig而非未声明的input
    const command = new GetParameterCommand(paramconfig)
    const parameter = await awsSSMClient.send(command)

    return parameter.Parameter.Value
}

关键说明

  • mockClient(SSMClient)会替换真实的SSM客户端实例,所有调用都会被拦截
  • on(GetParameterCommand)可以针对特定命令设置返回值或抛出错误
  • reset()方法确保每个测试用例的mock状态独立,避免测试污染

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:10