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

