【发布时间】:2021-05-05 12:04:27
【问题描述】:
我想模拟 s3.listObjects.promise() 并返回一个模拟值。但是,我不能这样做。这是我的实际代码,后面是单元测试。
const AWS = require('aws-sdk');
exports.handler = async (event,context,callback) => {
console.log(`event is ${JSON.stringify(event)}`);
const Bucket = event.s3Usage.Bucket;
const Prefix = event.s3Usage.Prefix || "";
let s3BucketSize = 0;
console.log(`Bucket name is ${Bucket} and Prefix is ${Prefix}`);
const s3 = new AWS.S3();
try {
const data = await s3.listObjects({ Bucket, Prefix }).promise();
console.log(`Data is ${JSON.stringify(data)}`);
if (data["Contents"].length > 1) {
s3BucketSize = data["Contents"].filter(x => x.Size > 0).map(x => x.Size).reduce((x, y) => x + y);
console.log(`Size of the folder is ${s3BucketSize} bytes.`);
} else {
console.log(`Size of the folder is 0 bytes.`);
}
} catch (err) {
console.error(`Error is ${JSON.stringify(err)}`);
callback(err)
}
return s3BucketSize;
}
以下是我的单元测试:-
const handler = require("../index").handler;
const { S3 } = require('aws-sdk');
jest.mock('aws-sdk');
const mockOutput = {
"IsTruncated": false,
"Marker": "",
"Contents": [
{
"Key": "GodIsGreat.PNG",
"LastModified": "2021-05-04T14:32:59.000Z",
"ETag": "\"b45d6e6a40ab1c9ebf541093fe8959e6\"",
"Size": 100,
"StorageClass": "STANDARD",
"Owner": {
"ID": "98062a6ccbfb88d9b333868c14d5379ec23dab90210de79b2bfbd801e948ae0c"
}
},
{
"Key": "test/",
"LastModified": "2021-03-02T08:09:37.000Z",
"ETag": "\"d41d8cd98f00b204\"",
"Size": 50,
"StorageClass": "STANDARD",
"Owner": {
"ID": "98062a6ccbfb88d9b3338"
}
}
],
"Name": "xx",
"Prefix": "",
"MaxKeys": 1000,
"CommonPrefixes": []
};
const s3ListObjectsPromise = jest.fn().mockReturnValue({
promise: jest.fn().mockResolvedValue(mockOutput)
});
S3.mockImplementation(() => ({
listObjects: s3ListObjectsPromise
}));
const event = {
s3Usage: {
"Bucket": "xxx",
"Prefix": ""
}
};
describe("When the handler is invoked with an event", () => {
// afterEach(jest.clearAllMocks);
test("the correct response is returned", async () => {
const res = await handler(event);
console.log(`res value is ${res}`);
});
});
当我运行测试时,我看到对 S3 对象的实际调用正在发生。如何避免这种情况? 谢谢。
【问题讨论】:
-
无法重现。它对我有用。
-
@slideshowp2 感谢您的帮助。我指定了失败的原因作为答案。
标签: javascript node.js amazon-web-services unit-testing jestjs