类型错误:限。SecretsManager不是一个构造单元的测试与proxyquire

0

的问题

我已经写代码一个测试,以测试代码,让凭证AWS秘密的管理。 我用proxyquire和sinon为碰和得到这一错误。

功能我需要测试

    exports.getCredsFromAWSSecretsManager = (keyName) => {
    const SM = new AWS.SecretsManager({
        apiVersion: process.env.AWS_SM_API_VERSION,
        region: process.env.AWS_SM_REGION
    });

    return SM.getSecretValue(params).promise().then((data) => {
        logger.info(logMsgs.awsHlpr_smGetSecretValueSuccess(JSON.stringify(data)));
        return JSON.parse(data.SecretString);
        
    }).catch((err) => {
        logger.error(logMsgs.awsHlpr_smGetSecretValueErr(JSON.stringify(err)));
        throw err;
    });
};

测试情况,我写了

const sinon = require("sinon");
const proxyquire = require("proxyquire").noCallThru().noPreserveCache();
const { mockLogger } = require("../../mockdata/mockLogger");

let awsHelper;
let secretsManagerStub;

describe.only("AWS Helper ", () => {

    // function1

    describe("AWS Helper: getCredsFromAWSSecretsManagera method", () => {

        before((done) => {
            const data = {
                SecretString: JSON.stringify({ publicKey: 'secretUsername', privateKey: 'secretPassword' }),
              };
            
            secretsManagerStub = {
                getSecretValue: sinon.stub().callsFake((params, callback) => {
                  callback(null, data);
                }),
               
              };

            const awsStub = {
                
                  SecretsManager: sinon.stub().returns(secretsManagerStub)
               
                
            } 
            awsHelper = proxyquire('../../../utils/aws_helper.js', {
                'aws-sdk':{
                    AWS:awsStub
                } ,
                 "../../utils/logger": mockLogger,
            }); 
            
              

            done();
        });

        afterEach(() => {
            
            sinon.restore();
        });

        it('should write random data!', async () => {

            const expectedData = "abcdef";

            secretsManagerStub.getSecretValue.yields(null, expectedData);

            const data = await awsHelper.getCredsFromAWSSecretsManager();

            sinon.assert.callCount(secretsManagerStub.getSecretValue, 1);
            assert.strictEqual(data, expectedData);
            
        });

    });
});

这个代码给了我错误说 类型错误:限。SecretsManager不是一个构造

任何帮助,将不胜感激。

aws-sdk proxyquire sinon unit-testing
2021-10-29 03:33:30
1

最好的答案

1

AWS 是一个名字空间,它包含所有asw服务类喜欢 SecretsManager. 你应该提供 awsStubaws-sdk有没有需要包裹 awsStub 内部的对象。

aws_helper.js:

const AWS = require('aws-sdk');

exports.getCredsFromAWSSecretsManager = () => {
  const SM = new AWS.SecretsManager({
    apiVersion: process.env.AWS_SM_API_VERSION,
    region: process.env.AWS_SM_REGION,
  });
  const params = {
    SecretId: '1',
  };

  return SM.getSecretValue(params)
    .promise()
    .then((data) => {
      console.info(data);
      return JSON.parse(data.SecretString);
    })
    .catch((err) => {
      console.error(err);
      throw err;
    });
};

aws_helper.test.js:

const sinon = require('sinon');
const proxyquire = require('proxyquire').noCallThru().noPreserveCache();

let awsHelper;
let secretsManagerStub;

describe('AWS Helper: getCredsFromAWSSecretsManagera method', () => {
  before(() => {
    const data = {
      SecretString: JSON.stringify({ publicKey: 'secretUsername', privateKey: 'secretPassword' }),
    };

    secretsManagerStub = {
      getSecretValue: sinon.stub().returnsThis(),
      promise: sinon.stub().resolves(data),
    };

    const awsStub = {
      SecretsManager: sinon.stub().returns(secretsManagerStub),
    };
    awsHelper = proxyquire('./aws_helper.js', {
      'aws-sdk': awsStub,
    });
  });

  afterEach(() => {
    sinon.restore();
  });

  it('should write random data!', async () => {
    const data = await awsHelper.getCredsFromAWSSecretsManager();
    sinon.assert.callCount(secretsManagerStub.getSecretValue, 1);
    sinon.assert.match(data, { publicKey: 'secretUsername', privateKey: 'secretPassword' });
  });
});

测试结果:

  AWS Helper: getCredsFromAWSSecretsManagera method
{
  SecretString: '{"publicKey":"secretUsername","privateKey":"secretPassword"}'
}
    ✓ should write random data!


  1 passing (2s)

---------------|---------|----------|---------|---------|-------------------
File           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------|---------|----------|---------|---------|-------------------
All files      |   77.78 |      100 |   66.67 |   77.78 |                   
 aws_helper.js |   77.78 |      100 |   66.67 |   77.78 | 19-20             
---------------|---------|----------|---------|---------|-------------------
2021-10-29 05:09:05

非常感谢。 它现在的作品。 我可以知道为什么我们应该定义参数内部的功能吗? 和是否有任何方式不改变职能的代码。 对不起我不善于服务AWS
Sanjana Ekanayake

@SanjanaEkanayake params? 我没有看到这个变量从你的代码,所以我创造一个使代码可执行的。 点是演示测试
slideshowp2

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................