You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest环境下AWS S3上传与预签名URL的Mock测试实现

完善Jest测试用例验证大响应场景下的S3重定向逻辑

核心思路

要覆盖大响应场景的重定向逻辑,需正确Mock AWS S3的upload和getSignedUrl方法,同时模拟Lambda返回超1MB的响应数据,最终验证处理函数的重定向行为。

实现步骤

  1. Mock AWS S3模块
    使用Jest的jest.mock拦截AWS SDK的S3类,替换为Mock实现,确保测试不调用真实AWS服务。

  2. 模拟大响应数据
    生成大小超过1MB的测试数据(比如1.1MB的字符串或Buffer),作为Lambda调用的返回结果。

  3. Mock S3方法的返回值

    • 让upload方法返回解析成功的Promise,模拟文件上传成功。
    • 让getSignedUrl返回预设的预签名URL,模拟S3生成链接的行为。
  4. 验证关键行为

    • 确认S3的upload方法被调用,且参数符合预期(存储桶名、对象键、内容等)。
    • 确认处理函数返回302状态码,且重定向目标为预签名URL。

完整测试代码示例

// 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:25:16