使用sinon stub模拟saveData时仍调用真实AWS SQS接口如何解决
问题核心原因
- 错误stub了被测对象
mainFunction本身:你把需要验证逻辑的主函数直接模拟了,没有运行真实的主函数内部代码 - 测试用例缺失核心逻辑:仅设置了
saveData的模拟返回值,没有调用主函数触发执行,也没有处理异步测试的完成信号,导致测试框架触发超时 - 引用不一致风险:如果主模块里的
saveData不是通过公共模块导出的方式引入,会导致你stub的saveData和主函数实际调用的不是同一个实例,最终触发真实的SQS调用,抛出region配置缺失的错误
修复步骤
1. 删除多余的主函数模拟逻辑
你需要测试真实的mainFunction逻辑,不需要对它做stub,移除所有相关代码:
// 移除变量声明 let mainFunctionStub; // 移除beforeEach中的这行 mainFunctionStub = sinon.stub(main, 'mainFunction'); // 移除afterEach中的这两行 mainFunctionStub.restore(); mainFunctionStub.reset();
2. 确保主模块的saveData引用一致
检查你的main-function.js文件顶部,必须和测试文件用相同的方式引入saveData:
// main-function.js 顶部添加导入(你原代码漏了这行,是导致模拟不生效的核心原因之一) const { saveData } = require('lib/queue');
3. 补全测试用例逻辑
修改测试用例,补全主函数调用、异步处理、断言逻辑:
it(`should return success`, async () => { const name = 'Name'; const age = 'Age'; // 设置saveData的模拟返回 saveDataStub.resolves({ name, age }); // 调用被测主函数 const result = await main.mainFunction(name, age); // 断言返回结果正确 expect(result).to.be.true; // 断言saveData被正确调用 expect(saveDataStub.calledOnceWith(name, age)).to.be.true; });
可选:直接模拟AWS SQS实例
如果你需要测试saveData本身的逻辑,不想模拟saveData,可以直接 stub AWS SQS的底层方法:
// 测试文件顶部导入AWS const AWS = require('aws-sdk'); describe('/v1/main', () => { let sqsSendStub; beforeEach(() => { // 模拟SQS的sendMessage方法 sqsSendStub = sinon.stub(AWS.SQS.prototype, 'sendMessage').returns({ promise: () => Promise.resolve({ MessageId: 'mock-test-id' }) }); }); afterEach(() => { sqsSendStub.restore(); }); // 后续测试用例直接使用即可,不会触发真实SQS调用 });
内容的提问来源于stack exchange,提问作者ABCD
相关产品推荐
相关产品推荐

