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

aws-sdk-mock模拟S3 getObject时调用的是哪个createReadStream?

问题原因

aws-sdk的S3.getObject方法在未传入回调函数时,返回的是AWS.Request实例,而非你模拟的静态对象。你直接给AWS.mock传静态对象的写法,实际触发了aws-sdk-mock的默认包装逻辑,返回的依然是标准Request实例,你定义的createReadStream方法没有被正确挂载,你调用的实际是Request原生的createReadStream方法,自然返回的不是你要的本地文件流。

正确模拟写法

你需要将mock的第三个参数改为替换getObject的实现函数,直接返回携带自定义createReadStream的对象,跳过默认Request实例逻辑:

const fs = require('fs');
const path = require('path');
const AWS = require('aws-sdk-mock');
// 用绝对路径避免文件读取失败
const testDataFile = path.resolve(__dirname, '你的测试文件相对路径');

const s3Spy = AWS.mock("S3", "getObject", function (params, callback) {
  // 兼容传回调的调用方式
  if (callback) {
    callback(null, { Body: fs.readFileSync(testDataFile) });
  }
  // 返回满足链式调用的对象
  return {
    createReadStream: () => fs.createReadStream(testDataFile),
    // 如果业务代码有调用.promise()的场景,可新增这个方法
    promise: () => Promise.resolve({ Body: fs.readFileSync(testDataFile) })
  };
});

验证与注意事项

  • 调整后再打印stream.path即可拿到本地测试文件的路径,流读取逻辑完全走本地文件,不会发起真实网络请求
  • 单测执行结束后调用AWS.restore("S3", "getObject")清理mock,避免影响其他测试用例

内容的提问来源于stack exchange,提问作者Dan Monego

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:39:05