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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:42:18