在 Node.js 中使用 Jest 模拟 @aws-sdk/client-ssm (AWS SDK v3) 总是超时

问题描述 投票:0回答:1

当我模拟 AWS SDK v3 时,测试用例超时,否则它可以正常工作。它适用于

GetParameterCommand
,但不适用于
GetParametersCommand

我的sdk文件如下所示

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;

我的主文件如下所示:

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 };

我的测试文件如下所示:

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);
  });
});
node.js jestjs mocking aws-sdk aws-ssm
1个回答
0
投票

您没有正确模拟

ssmClient.send()
方法。它接受两个参数,第一个是命令,第二个是错误优先回调。

例如

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 function validateValue(data) {
  const ssmResp = await getParams('MY_SSM');
  console.log("🚀 ~ validateValue ~ ssmResp:", ssmResp)
  return ssmResp == data;
}

module.exports = { validateValue };

main.test.js

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

jest.mock('@aws-sdk/client-ssm', () => ({
  SSMClient: jest.fn(() => ({
    send: jest.fn((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);
  });
});

测试结果:

  console.log
    🚀 ~ validateValue ~ ssmResp: 12344556

      at log (stackoverflow/78315783/main.js:9:11)

 PASS  stackoverflow/78315783/main.test.js
  validateValue                                                                                                                                                                                                                                      
    √ value should match (15 ms)                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                     
Test Suites: 1 passed, 1 total                                                                                                                                                                                                                       
Tests:       1 passed, 1 total                                                                                                                                                                                                                       
Snapshots:   0 total
Time:        0.755 s, estimated 6 s
Ran all test suites related to changed files.

封装版本:

"jest": "^29.7.0",
"@aws-sdk/client-ssm": "^3.554.0",
© www.soinside.com 2019 - 2024. All rights reserved.