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
相关产品推荐
相关产品推荐

