【问题标题】:Sinon Stub not working with AWS Parameter store (NodeJS)Sinon Stub 不适用于 AWS 参数存储 (NodeJS)
【发布时间】:2020-06-12 06:43:04
【问题描述】:

我正在尝试存根对 aws 参数存储 (PS) 的调用。但即使我以多种方式添加了存根,它总是会实际调用 aws PS。

我正在尝试测试的方法

function getParamsFromParamterStore() {
    return ssm.getParametersByPath(query).promise();
}

我尝试过的一种存根方法

var ssm = new AWS.SSM();
stub1 = sinon.stub(ssm, 'getParametersByPath').returns({promise: () => {}});
moduleName.__get__('getParamsFromParamterStore')();

但这实际上是调用 PS。

注意:由于这是一个私有函数(未导出),我使用rewire 来访问它。

【问题讨论】:

    标签: node.js mocha.js sinon aws-sdk-js aws-parameter-store


    【解决方案1】:

    这里是单元测试解决方案:

    index.js:

    const AWS = require('aws-sdk');
    const ssm = new AWS.SSM();
    
    function getParamsFromParamterStore(query) {
      return ssm.getParametersByPath(query).promise();
    }
    

    index.test.js:

    const rewire = require('rewire');
    const sinon = require('sinon');
    const { expect } = require('chai');
    const mod = rewire('./');
    
    describe('60447015', () => {
      it('should pass', async () => {
        const ssmMock = { getParametersByPath: sinon.stub().returnsThis(), promise: sinon.stub().resolves('mock data') };
        const awsMock = {
          SSM: ssmMock,
        };
        mod.__set__('ssm', awsMock.SSM);
        const actual = await mod.__get__('getParamsFromParamterStore')('query');
        expect(actual).to.be.eq('mock data');
        sinon.assert.calledWithExactly(ssmMock.getParametersByPath, 'query');
        sinon.assert.calledOnce(ssmMock.promise);
      });
    });
    

    100% 覆盖率的单元测试结果:

      60447015
        ✓ should pass
    
    
      1 passing (30ms)
    
    ----------|---------|----------|---------|---------|-------------------
    File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ----------|---------|----------|---------|---------|-------------------
    All files |     100 |      100 |     100 |     100 |                   
     index.js |     100 |      100 |     100 |     100 |                   
    ----------|---------|----------|---------|---------|-------------------
    

    【讨论】:

    • 但是为什么我的方法不起作用。我看到了类似的 S3 stbbing 方法,它与我所做的完全相同。有什么特定于 SSM 的吗?
    • @user2088083 看来您在测试用例中存根了一个新的 ssm 实例。此实例与index.js 文件中的 ssm 实例不同。这就是为什么使用__set__ rewire 方法来存根index.js 文件中的ssm 实例。
    猜你喜欢
    • 2018-12-31
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2017-08-08
    相关资源
    最近更新 更多