使用AWS SDK v3模拟GetObjectCommand响应的流类型适配问题
解决AWS SDK v3 Mock中本地流与SdkStream类型不匹配问题
问题原因
S3 GetObjectCommand 返回的 Body 是 SdkStream<Readable> 类型,它是AWS对Node.js Readable 流的包装,带有额外的SDK相关方法。直接传入本地 fs.ReadStream 会触发类型不兼容错误。
解决方案
使用 aws-sdk-client-mock 提供的 sdkStreamMixin 工具,将本地流包装成符合要求的 SdkStream 类型。
修改后的测试代码
import { mockClient, sdkStreamMixin } from "aws-sdk-client-mock"; import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; import fs from "fs"; import type { ReadStream } from "fs"; const s3ClientMock = mockClient(S3Client); test("getJSONFroms3Item returns data correctly with a gzip file from s3", async () => { // 读取本地gzip文件流 const localStream: ReadStream = fs.createReadStream('../resources/persons.json.gz'); // 用sdkStreamMixin包装本地流,转换为SdkStream类型 const sdkStream = sdkStreamMixin(localStream); // 模拟S3响应,传入包装后的流 s3ClientMock.on(GetObjectCommand).resolves({ Body: sdkStream }); const result = await getJSONFroms3Item(); expect(s3ClientMock).toHaveReceivedCommandWith(GetObjectCommand, {}); expect(result).toContainEqual({ name: "Jane Doe", address: "happytown", lastUpdated: 1657116641655, isActive: true, status:"ACTIVE" }); });
关键说明
sdkStreamMixin会给本地Readable流添加AWS SDK流所需的方法(如transformToByteArray、transformToString等),同时让类型系统识别为合法的SdkStream。- 断言需用
toContainEqual而非toContain,因为toContain检查数组是否包含严格相等的对象引用,toContainEqual会做深度值对比。
内容的提问来源于stack exchange,提问作者tmc
相关产品推荐
相关产品推荐

