如何正确Mock AWS RDSDataService的executeStatement方法?
AWS RDSDataService executeStatement Mock失效解决指南
核心失效原因排查
- 版本不兼容:
aws-sdk-mock仅支持aws-sdk v2,如果你使用的是v3版本的@aws-sdk/client-rds-data,该库本身就不支持,是mock不生效的最常见原因。 - 执行顺序错误:必须先完成mock逻辑,再引入你的数据库操作模块,如果模块内的RDSDataService实例在mock执行前就已经初始化完成,mock不会对已生成的实例生效。
- proxyquire配置错误:使用proxyquire时没有加
'@noCallThru': true参数,会导致原依赖被加载,或者模块缓存没有清空,重复加载旧的未mock的模块实例。 - 方法名/Command名不匹配:v2的调用方法是
executeStatement,v3需要对应ExecuteStatementCommand,打桩的目标名称错误会导致无法命中mock逻辑。
不同版本的正确实现方案
不需要额外的第三方mock库,只要和你使用的AWS SDK版本匹配即可。
场景1:使用aws-sdk v2
数据库操作文件(db.js)示例
const AWS = require('aws-sdk'); const rdsDataService = new AWS.RDSDataService(); async function updateUser(userId, data) { try { await rdsDataService.executeStatement({ resourceArn: '你的RDS实例ARN', secretArn: '你的秘钥ARN', sql: 'UPDATE users SET name = :name WHERE id = :id', parameters: [ { name: 'id', value: { stringValue: userId } }, { name: 'name', value: { stringValue: data.name } } ] }).promise(); return true; } catch (e) { throw new Error('无法完成指定用户更新'); } } module.exports = { updateUser };
测试代码示例
const AWSMock = require('aws-sdk-mock'); const proxyquire = require('proxyquire'); const { expect } = require('chai'); describe('用户更新测试', () => { let updateUser; beforeEach(() => { // 先执行mock AWSMock.mock('RDSDataService', 'executeStatement', (params, callback) => { // 模拟调用成功返回 callback(null, { numberOfRecordsUpdated: 1 }); }); // 再通过proxyquire引入数据库模块,禁用原依赖加载 updateUser = proxyquire('./db', { 'aws-sdk': AWS, '@noCallThru': true }).updateUser; }); afterEach(() => { // 清空mock和缓存 AWSMock.restore('RDSDataService'); delete require.cache[require.resolve('./db')]; }); it('用户更新正常返回', async () => { const result = await updateUser('1001', { name: '测试用户' }); expect(result).to.be.true; }); });
场景2:使用aws-sdk v3
aws-sdk-mock不支持v3,需要使用aws-sdk-client-mock,先安装依赖:npm i -D aws-sdk-client-mock
测试代码示例
const { mockClient } = require('aws-sdk-client-mock'); const { RDSDataClient, ExecuteStatementCommand } = require('@aws-sdk/client-rds-data'); const { expect } = require('chai'); const rdsMock = mockClient(RDSDataClient); describe('用户更新测试', () => { let updateUser; beforeEach(() => { // 重置mock,配置Command返回 rdsMock.reset(); rdsMock.on(ExecuteStatementCommand).resolves({ numberOfRecordsUpdated: 1 }); // 引入数据库模块 updateUser = require('./db').updateUser; }); it('用户更新正常返回', async () => { const result = await updateUser('1001', { name: '测试用户' }); expect(result).to.be.true; }); });
内容的提问来源于stack exchange,提问作者user4002112
相关产品推荐
相关产品推荐

