【问题标题】:NodeJS: Mock promise of aws-sdkNodeJS:aws-sdk 的模拟承诺
【发布时间】:2018-03-21 16:27:53
【问题描述】:

我目前正在编写 NodeJS 中的一些代码。

我的代码如下所示:

const AWS = require('aws-sdk');
const PARAMS_ACCOUNT = {
  AttributeNames: [
     "max-instances"
  ]
 };

const ec2 = new AWS.EC2();
const getAccountAttributes = ec2.describeAccountAttributes(PARAMS_ACCOUNT).promise();

function maxInstances() {
    return getAccountAttributes.then(data => {
        return  data.AccountAttributes[0].AttributeValues[0].AttributeValue;
    });
 }

我尝试在chaiJSmochaJS 旁边使用aws-sdk-mock,但我不确定如何模拟aws-sdk.promise()

我的尝试如下所示:

const chai = require('chai');
const mocha = require('mocha');
const awsSDK = require('aws-sdk');
const aws = require('aws-sdk-mock');
const server = require('../instance_limit.js');

const expect = chai.expect;

describe('Sample test', () => {
 it('this is also a test', () => {
  aws.mock('EC2','describeAccountAttributes',function (params, callback){
    callback(null, {AccountAttributes:[{AttributeValues:[{AttributeValue: 10}]}]});
  });
  var awsEC2 = new awsSDK.EC2();
   const instances = server.maxInstances();
   expect(instances).to.equal(10);
  });
});

但是有了这个,我无法模拟aws-sdk 调用。 感谢您的帮助。

【问题讨论】:

    标签: node.js mocha.js chai aws-sdk-js aws-sdk-mock


    【解决方案1】:

    我能够通过使用依赖注入的原理来解决这个问题,在这种情况下,它可以防止模拟 aws sdk,因为有必要稍微调整我的函数并设置一个默认值。 现在看起来像这样:

    const AWS = require('aws-sdk');
    const PARAMS_ACCOUNT = {
      AttributeNames: [
     "max-instances"
      ]
     };
    
    const ec2 = new AWS.EC2();
    const getAccountAttributes = ec2.describeAccountAttributes(PARAMS_ACCOUNT).promise();
    
    function maxInstances(accountAttributes = getAccountAttributes()) {
        return accountAttributes.then(data => {
            return data.AccountAttributes[0].AttributeValues[0].AttributeValue;
        });
    }
    

    现在我可以在测试期间提供一个样本值,如下所示:

    const chai = require('chai');
    const mocha = require('mocha');
    const server = require('../instance_limit.js');
    
    const expect = chai.expect;
    
    describe('data calculation based on ec2 values', () => {
     it(' expects to return max Instances value equal 10', () => {
       const accountAttributeObject = {AccountAttributes:[{AttributeValues:[{AttributeValue: 10}]}]}
       const accountAttributes = Promise.resolve(accountAttributeObject);
       const instances = server.maxInstances(accountAttributes);
    
       return instances.then( data => {
         expect(data).to.equal(10);
       });
      });
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-14
      • 2019-06-01
      • 1970-01-01
      • 2020-10-07
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      相关资源
      最近更新 更多