文件系统对象使用 SDK 的 v3 模拟 GetObjectCommand 响应"/>
使用文件系统对象使用 SDK 的 v3 模拟 GetObjectCommand 响应
我有一个方法可以从 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'.
我花了很长时间试图弄清楚如何从文件系统中获取可读文件,但没有运气。
我使用提供的答案 给我指导,但看不到让它工作。
沙箱在这里/
非常感谢任何帮助。
回答如下:自版本 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});
...
});
更多推荐
使用文件系统对象使用 SDK 的 v3 模拟 GetObjectCommand 响应
发布评论