如何使用Jest-node.js模拟s3.upload()



我试图用这个指令模拟s3上传函数,但当我使用这个模式时,会有一个

类型错误:s3.upload不是函数

// upload.test.js
const AWS = require('aws-sdk');
jest.mock('aws-sdk', () => {
const mS3 = { upload: jest.fn().mockReturnThis(), promise: jest.fn() };
return { S3: jest.fn(() => mS3) };
});
const s3 = new AWS.S3();
s3.upload({}).promise.mockResolvedValueOnce({ Bucket: 'XXX' });

我也在使用SQS,对于这个模式,我有另一个错误:

AWS.SQS不是构造函数

我该如何处理它?

// upload.js
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
s3Params = {
Bucket: S3_BUCKET,
Key: `example.xml`,
ACL: 'public-read',
ContentType: 'application/json',
Body: Buffer.from(file)
}
}
await s3.upload(s3Params).promise();

当使用Jest.mockReturnValueOnce时,您需要执行mock AFTER,该值被设置为能够接收您在mockReturnValueOnce中定义的值作为响应,

例如,模拟S3:

// s3-mock.test.js
let AWS = require('aws-sdk');
jest.mock('aws-sdk', () => {
let instance = {
upload: jest.fn().mockReturnThis(),
promise: jest.fn(),
};
return { S3: jest.fn(() => instance) };
});

describe("setup for s3.upload testing", () => {
let testS3;
beforeEach(() => {
testS3 = new AWS.S3();
testS3.promise.mockReturnValueOnce({ Bucket: 'TestBucketName' });
})
test('returns expected upload value', async () => {
let params = {};
let result = await testS3.upload(params).promise();
expect(result).toEqual({ Bucket: 'TestBucketName' });
expect(result.Bucket).toBe("TestBucketName")
});
});

嘲笑SQS:

// sqs-mock.test
let AWS = require('aws-sdk');
jest.mock('aws-sdk', () => {
let instance = {
sendMessage: jest.fn().mockReturnThis(),
promise: jest.fn(),
};
return { SQS: jest.fn(() => instance) };
});

describe("setup for sqs.sendMessage testing", () => {
let testSQS;
beforeEach(() => {
testSQS = new AWS.SQS();
testSQS.promise.mockReturnValueOnce({ MessageId: 'TestSQSId' });
})
test('returns expected message id', async () => {
let params = {};
let result = await testSQS.sendMessage(params).promise();
expect(result).toEqual({ MessageId: 'TestSQSId' });
expect(result.MessageId).toBe("TestSQSId")
});
});

上的工作示例https://github.com/oieduardorabelo/jest-mock-aws-sdk

正如你所看到的,它们是相同的,你也可以在Jest中使用手动mock,文件夹__mocks__包含你的所有软件包,要在测试中进行mock,请查看以下文档:https://jestjs.io/docs/manual-mocks

尝试使用aws-sdk/clients/s3而不是aws-sdk

最新更新