【问题标题】:Does aws-sdk-mock support mocking of AWS SSM (Parameter Store)?aws-sdk-mock 是否支持模拟 AWS SSM(参数存储)?
【发布时间】:2019-12-07 20:29:12
【问题描述】:

我正在尝试使用 aws-sdk-mock 和下面的代码来模拟 AWS SSM,但无法正常工作。不抛出错误,在调用getParametersByPath 时从实际存储中获取值。

我查看了 aws-sdk-mock 文档,但似乎没有模拟 ssm 的示例,是否支持。

AWSMock.mock('SSM', 'getParametersByPath', (params, callback) => {
  callback(null, mockResponse);
});

【问题讨论】:

  • Richard,我认为它不支持 SSM,所以如果对你有帮助,我不得不模拟整个库。我推荐了jestjs.io/docs/en/manual-mocks.html
  • 最后我使用了 localstack docker image.. 在测试中效果很好,对外部也有好处:)
  • 嗨@RichardParkins,我知道这有点老了,但我想知道您是否有在测试中使用localstack SSM 的示例?我显然错过了一些简单的东西,但我无法让它工作(我可以让 S3 工作,但不能让 SSM 工作)。提前致谢
  • 嗨@JimM。我在 S3 上被搁置了,希望几天后能拿起 SSM。我会及时通知你。您可能会发现 localstack 自从我的帖子以来已经更新并且对 SSM 有更好的支持?
  • 嗨 @RichardParkins,原来 LocalStack 和 SSM 的问题是我们正在使用“spring-boot-parameter-store-integration”(mvnrepository.com/artifact/com.coveo/…),他们在“bootstrap”中启动他们的代码',并创建自己的默认凭证 AWS 处理程序。一位同事想出了如何处理这个问题,并且能够让它发挥作用。谢谢!

标签: jestjs aws-sdk-nodejs ssm aws-parameter-store aws-sdk-mock


【解决方案1】:

我在尝试执行类似操作时遇到了这个问题:尝试模拟 SSM 功能时,资源仍在尝试向 AWS 发出请求并且没有使用模拟功能。

例子:

    import { mock } from 'aws-sdk-mock';
    import { SSM } from 'aws-sdk';
    import { GetParameterRequest, GetParameterResult } from 'aws-sdk/clients/ssm';
    import 'mocha'

    ...
    const ssm: SSM = new SSM();
    mock('SSM', 'getParameter', async (request: GetParameterRequest) => {
        return { Parameter: { Value: 'value' } } as GetParameterResult;
    })

    const request: GetParameterRequest = { Name: 'parameter', WithDecryption: true};

    const result: GetParameterResult = await ssm.getParameter(request).promise();
    expect(result.Parameter.Value).to.equal('value');
    ...

调用getParameter时出错。

原来我们出错的原因是我们在声明我们的模拟之前实例化了集成。所以解决方法是切换执行顺序并在实例化集成之前声明模拟。

例子:

    import { mock } from 'aws-sdk-mock';
    import { SSM } from 'aws-sdk';
    import { GetParameterRequest, GetParameterResult } from 'aws-sdk/clients/ssm';
    import 'mocha'

    ...
    mock('SSM', 'getParameter', async (request: GetParameterRequest) => {
        return { Parameter: { Value: 'value' } } as GetParameterResult;
    });
    // -> Note the following line was moved below the mock declaration.
    const ssm: SSM = new SSM();

    const request: GetParameterRequest = { Name: 'parameter', WithDecryption: true};

    const result: GetParameterResult = await ssm.getParameter(request).promise();
    expect(result.Parameter.Value).to.equal('value');
    ...

【讨论】:

  • 嗨,我一直在努力解决这个问题。我有另一个文件 amazon.js,其中有使用 ssm.getParameter() 的函数 getParameterFromStore(param)。我用 jest.mock('amazon.js') 模拟 amozon.js,然后像你在示例中那样模拟 SSM,当我期望(amazon.getParameterFromStore ....)时,似乎 SSM 没有被模拟。有什么建议吗?
  • 可能是操作顺序问题。根据您使用的是类还是直接函数,实际实现可能会有所不同,但您必须声明模拟 before new SSM()。模拟只影响在声明模拟之后创建的实例。如果您在测试文件的顶部导入amazon.js,并且amazon.js 文件中的某个位置是new SSM(),那么它将在您的任何测试代码之前执行,因此您的模拟将不适用。
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 2021-11-28
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2020-08-13
相关资源
最近更新 更多