TypeError: AWS.SecretsManager no es un constructor de la unidad de pruebas con proxyquire

0

Pregunta

He escrito un código de prueba para probar el código que le da credenciales de AWS Secreto Manager. He utilizado proxyquire y sinon por intermitencia y obtener este error.

Función quiero probar

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

Caso de prueba que he escrito

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

    });
});

Este código me da un error diciendo: TypeError: AWS.SecretsManager no es un constructor

cualquier ayuda sería muy apreciada.

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

Mejor respuesta

1

AWS es un espacio de nombres, contiene todos los servicios de AWS clases como SecretsManager. Usted debe proporcionar la awsStub a aws-sdk, no hay necesidad de ajustar la awsStub dentro de un objeto.

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

el resultado de la prueba:

  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

Muchas gracias. Funciona ahora. Puedo saber por qué deberíamos definir parámetros dentro de la función? Y Es allí cualquier manera de no cambiar el código de la función. Lo siento, no soy buena en los servicios de AWS
Sanjana Ekanayake

@SanjanaEkanayake params? No vi esta variable a partir de su código, de modo que crear uno para hacer que el código ejecutable. El punto es demostrar con pruebas
slideshowp2

En otros idiomas

Esta página está en otros idiomas

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