使用文件系统对象使用 SDK 的 v3 模拟 GetObjectCommand 响应

问题描述 投票:0回答:1

我有一个方法可以从 s3 中提取并处理检索到的 gzip 文件。我正在尝试编写一个模拟检索的测试(使用从 FS 读取的文件),然后可以测试文件的处理。

aws-sdk-client-mock 绝对是我在其他地方使用过的方法,但在这里解析流类型有困难。

import {mockClient} from "aws-sdk-client-mock";

const s3ClientMock = mockClient(S3Client);

test("getJSONFroms3Item returns data correctly with a gzip file from s3", async () => {
    let stream: ReadStream = fs.createReadStream('../resources/persons.json.gz');
    s3ClientMock.on(GetObjectCommand).resolves({ Body: stream});
    const result =  await getJSONFroms3Item();
    expect(s3ClientMock).toHaveReceivedCommandWith(GetObjectCommand, {});
    expect (result).toContain({name: "Jane Doe", address: "happytown", lastUpdated: 1657116641655, isActive: true, status:"ACTIVE"})
});

我得到的错误是

   __test__/src/S3.test.ts:22:54 - error TS2322: Type 'ReadStream' is not assignable to type 'SdkStream<Readable | ReadableStream<any> | Blob | undefined> | undefined'.
  Type 'ReadStream' is not assignable to type 'Readable & SdkStreamMixin'.

我花了很长时间试图弄清楚如何从文件系统中获取可读文件,但没有运气。

我使用提供的答案 https://stackoverflow.com/a/72196278/10917982 给我指导,但看不到让它工作。

沙箱在这里https://taramcc-ominous-space-umbrella-7vq7j764xj9f799.github.dev/

非常感谢任何帮助。

node.js typescript jestjs aws-sdk
1个回答
0
投票

自版本 3.188.0(10 月 22 日)起,S3 客户端支持 util 函数来使用和解析响应流(以前我们必须手动执行的操作)。

要模拟响应,你需要用util函数包装它

sdkStreamMixin()

所以现在,你需要这样做

import { mockClient } from "aws-sdk-client-mock";
import { sdkStreamMixin } from '@aws-sdk/util-stream-node';

const s3ClientMock = mockClient(S3Client);

test("getJSONFroms3Item returns data correctly with a gzip file from s3", async () => {
    const stream = sdkStreamMixin(fs.createReadStream('../resources/persons.json.gz'))
    s3ClientMock.on(GetObjectCommand).resolves({ Body: stream});
    ...
});
© www.soinside.com 2019 - 2024. All rights reserved.