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

