TypeError: AWS.SecretsManager नहीं है एक निर्माता इकाई में परीक्षण के साथ proxyquire

0

सवाल

मैं एक प्रश्न के लिखित कोड का परीक्षण करने के लिए परीक्षण कोड देता है कि साख से एडब्ल्यूएस गुप्त प्रबंधक. मैं प्रयोग किया जाता proxyquire और sinon के लिए stubbing और इस त्रुटि हो रही है.

समारोह में मैं परीक्षण करना चाहते हैं

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

    });
});

इस कोड मुझे त्रुटि देता है कह रही है TypeError: AWS.SecretsManager नहीं है एक निर्माता

किसी भी मदद की बहुत सराहना की जाएगी.

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

सबसे अच्छा जवाब

1

AWS एक नामस्थान होता है, सभी एडब्ल्यूएस सेवा संस्थान की तरह SecretsManager. आप प्रदान करना चाहिए awsStub करने के लिए aws-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

बहुत बहुत धन्यवाद. अब यह काम करता है. कर सकते हैं मुझे पता है क्यों करना चाहिए हम को परिभाषित पैरामीटर समारोह के अंदर? और वहाँ किसी भी तरह से नहीं बदलने के लिए समारोह कोड है । खेद है कि मैं अच्छा नहीं कर रहा हूँ पर एडब्ल्यूएस सेवाओं
Sanjana Ekanayake

@SanjanaEkanayake params? मैं देख नहीं था, इस चर से अपने कोड है, तो मैं बनाने के लिए बनाने के लिए एक कोड निष्पादन योग्य. बात है प्रदर्शित करने के लिए परीक्षण
slideshowp2

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में