Jest环境下AWS S3上传与预签名URL的Mock测试实现
完善Jest测试用例验证大响应场景下的S3重定向逻辑
核心思路
要覆盖大响应场景的重定向逻辑,需正确Mock AWS S3的upload和getSignedUrl方法,同时模拟Lambda返回超1MB的响应数据,最终验证处理函数的重定向行为。
实现步骤
Mock AWS S3模块
使用Jest的jest.mock拦截AWS SDK的S3类,替换为Mock实现,确保测试不调用真实AWS服务。模拟大响应数据
生成大小超过1MB的测试数据(比如1.1MB的字符串或Buffer),作为Lambda调用的返回结果。Mock S3方法的返回值
- 让
upload方法返回解析成功的Promise,模拟文件上传成功。 - 让
getSignedUrl返回预设的预签名URL,模拟S3生成链接的行为。
- 让
验证关键行为
- 确认S3的
upload方法被调用,且参数符合预期(存储桶名、对象键、内容等)。 - 确认处理函数返回302状态码,且重定向目标为预签名URL。
- 确认S3的
完整测试代码示例
// file.test.js const { getTestResultForBuildHandler } = require('./file'); const AWS = require('aws-sdk'); // Mock AWS S3与Lambda类 jest.mock('aws-sdk', () => { const mockS3 = { upload: jest.fn().mockReturnThis(), promise: jest.fn().mockResolvedValue({ Location: 's3://test-bucket/test-key' }), getSignedUrl: jest.fn().mockReturnValue('https://test-presigned-url.com/test-key') }; const mockLambda = { invoke: jest.fn().mockReturnThis(), promise: jest.fn() }; return { S3: jest.fn(() => mockS3), Lambda: jest.fn(() => mockLambda) }; }); describe('getTestResultForBuildHandler - 大响应场景', () => { it('当响应超过1MB时,上传至S3并返回重定向', async () => { // 生成约1.1MB的测试数据 const largeResponse = Buffer.alloc(1024 * 1024 + 10240, 'a').toString('utf8'); // Mock Lambda调用返回大响应 const lambdaInstance = new AWS.Lambda(); lambdaInstance.invoke().promise.mockResolvedValue({ Payload: JSON.stringify(largeResponse) }); // 调用处理函数(可传入实际需要的请求参数) const result = await getTestResultForBuildHandler({}); // 验证S3 upload调用参数 const s3Instance = new AWS.S3(); expect(s3Instance.upload).toHaveBeenCalledWith(expect.objectContaining({ Bucket: expect.any(String), // 替换为你的实际存储桶名 Key: expect.any(String), Body: largeResponse, ContentType: 'application/json' // 根据实际业务调整 })); // 验证getSignedUrl调用参数 expect(s3Instance.getSignedUrl).toHaveBeenCalledWith('getObject', expect.objectContaining({ Bucket: expect.any(String), Key: expect.any(String), Expires: expect.any(Number) // 验证过期时间参数(如果有设置) })); // 验证重定向响应 expect(result.statusCode).toBe(302); expect(result.headers.Location).toBe('https://test-presigned-url.com/test-key'); }); });
注意事项
- 替换代码中的存储桶名、ContentType等参数为你的实际业务配置。
- 若处理函数中对S3对象键有特定生成规则,需在
toHaveBeenCalledWith中添加对应匹配逻辑。 - 确保Mock的Lambda返回Payload格式与处理函数的解析逻辑一致(比如是否需要JSON.parse)。
内容的提问来源于stack exchange,提问作者Sahil Sangani
相关产品推荐
相关产品推荐

