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

如何正确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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:39:03