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

Node.js中使用Jest模拟AWS SDK v3的SSM时总是超时

解决Jest模拟AWS SDK v3时GetParametersCommand超时问题

问题场景

在Node.js环境下使用Jest模拟AWS SDK v3时,测试用例会出现超时问题,但不进行模拟时代码运行完全正常。其中GetParameterCommand可正常模拟工作,GetParametersCommand则会触发超时异常。

相关代码

SDK文件(sdk.js)

const { SSMClient, GetParametersCommand } = require('@aws-sdk/client-ssm');

const getSSMParameter = (param)=> new Promise((resolve, reject) => {
     const client = new SSMClient();
     const command = new GetParametersCommand({
        "Names": [ param ]
     });
     client.send(command, (error, resp) => {
       if(error) reject(error);
       else resolve(resp.Parameters[0].Value);
     });
}

module.exports = getSSMParameter;

主文件(main.js)

const { getSSMParameter } = require('./sdk');

async function getParams(paramName) {
  return getSSMParameter(paramName);
}

async validateValue(data){
  const ssmResp = await getParams('MY_SSM');
  return ssmResp == data;
}

module.exports = { "validateValue" };

测试文件(main.test.js)

const { validateValue } = require('./main');

jest.mock('@aws-sdk/client-ssm', () => ({
  "SSMClient": jest.fn(() => ({
    "send": () => ({
      "Parameters": [{
        "Name": 'MY_SSM',
        "Value": '12344556',
      }],
    }),
  })),
  "GetParametersCommand": jest.fn(),
}));

describe('validateValue', () => {
  test('value should match', async () => {
    expect(await validateValue('12344556')).toBe(true);
  });
});

问题原因

你的模拟代码存在关键错误:AWS SDK v3的send方法在使用回调模式时,需要异步触发传入的回调函数,而不是直接返回同步对象。原代码中getSSMParameter是通过client.send的回调来resolve/reject Promise的,但你当前的send模拟直接返回了一个对象,没有调用回调函数,导致Promise一直处于pending状态,Jest等待超时。

修正后的测试代码

const { validateValue } = require('./main');

jest.mock('@aws-sdk/client-ssm', () => ({
  SSMClient: jest.fn(() => ({
    // 修正send方法:调用传入的回调函数,传递模拟的响应
    send: (command, callback) => {
      callback(null, {
        Parameters: [{
          Name: 'MY_SSM',
          Value: '12344556',
        }]
      });
    }
  })),
  GetParametersCommand: jest.fn(),
}));

describe('validateValue', () => {
  test('value should match', async () => {
    expect(await validateValue('12344556')).toBe(true);
  });
});

说明

修改后的send方法会主动调用传入的回调函数,传递模拟的错误(这里为null)和响应数据,让getSSMParameter中的Promise正常resolve,测试就能顺利完成,不会再出现超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:32:10