node.js - 如何为正在访问 aws 资源的函数编写单元测试?

标签 node.js amazon-web-services mocha.js chai aws-sdk-mock

我有一个函数正在访问多个 aws 资源,现在需要测试这个函数,但我不知道如何模拟这些资源。

我已经尝试关注 aws-sdk-mock 的 github,但并没有得到太多。

function someData(event, configuration, callback) {

    // sts set-up
    var sts = new AWS.STS(configuration.STS_CONFIG);

    sts.assumeRole({
      DurationSeconds: 3600,
      RoleArn: process.env.CROSS_ACCOUNT_ROLE,
      RoleSessionName: configuration.ROLE_NAME
    }, function(err, data) {
      if (err) {
        // an error occurred
        console.log(err, err.stack);
      } else {
        // successful response

        // resolving static credential
        var creds = new AWS.Credentials({
          accessKeyId: data.Credentials.AccessKeyId,
          secretAccessKey: data.Credentials.SecretAccessKey,
          sessionToken: data.Credentials.SessionToken
        });

         // Query function
         var dynamodb = new AWS.DynamoDB({apiVersion: configuration.API_VERSION, credentials:  creds, region: configuration.REGION});
         var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: configuration.API_VERSION, region: configuration.REGION, endpoint: configuration.DDB_ENDPOINT, service: dynamodb });

            // extract params
            var ID = event.queryStringParameters.Id;
            console.log('metrics of id ' + ID);

            var params = {
                TableName: configuration.TABLE_NAME,
                ProjectionExpression: configuration.PROJECTION_ATTR,
                KeyConditionExpression: '#ID = :ID',
                ExpressionAttributeNames: {
                    '#ID': configuration.ID
                },
                ExpressionAttributeValues: {
                    ':ID': ID
                }
            };

            queryDynamoDB(params, docClient).then((response) => {
                console.log('Params: ' + JSON.stringify(params));
                // if the query is Successful
                if( typeof(response[0]) !== 'undefined'){
                    response[0]['Steps'] = process.env.STEPS;
                    response[0]['PageName'] = process.env.STEPS_NAME;
                }
                console.log('The response you get', response);
                var success = {
                    statusCode: HTTP_RESPONSE_CONSTANTS.SUCCESS.statusCode,
                    body: JSON.stringify(response),
                    headers: {
                        'Content-Type': 'application/json'
                    },
                    isBase64Encoded: false
                };
                return callback(null, success);
            }, (err) => {
                // return internal server error
                return callback(null, HTTP_RESPONSE_CONSTANTS.BAD_REQUEST);
            });
      }

    });

}

这是我需要测试的 lambda 函数,这里还使用了一些环境变量。

现在我尝试使用 aws-sdk-mock 为上述功能编写单元测试,但我仍然无法弄清楚如何实际执行它。任何帮助将不胜感激。下面是我的测试代码

describe('test getMetrics', function() {

    var expectedOnInvalid = HTTP_RESPONSE_CONSTANTS.BAD_REQUEST;

    it('should assume role ', function(done){
        var event = {
          queryStringParameters : {
              Id: '123456'
          }
        };

        AWS.mock('STS', 'assumeRole', 'roleAssumed');
        AWS.restore('STS');
        AWS.mock('Credentials', 'credentials');
        AWS.restore('Credentials');
        AWS.mock('DynamoDB.DocumentClient', 'get', 'message');
        AWS.mock('DynamoDB', 'describeTable', 'message');
        AWS.restore('DynamoDB');
        AWS.restore('DynamoDB.DocumentClient');

        someData(event, configuration, (err, response) => {
            expect(response).to.deep.equal(expectedOnInvalid);
            done();
        });


    });


});

我收到以下错误:

{ MultipleValidationErrors: There were 2 validation errors:
* MissingRequiredParameter: Missing required key 'RoleArn' in params
* MissingRequiredParameter: Missing required key 'RoleSessionName' in params

最佳答案

尝试显式设置 aws-sdk 模块。
不会正确模拟顶级 node_modules 项目文件夹中不包含 aws-sdk 的项目结构。这方面的一个例子是在嵌套项目目录中安装 aws-sdk。您可以通过使用 setSDK() 显式设置嵌套 aws-sdk 模块的路径来解决此问题。

const AWSMock = require('aws-sdk-mock');
import AWS = require('aws-sdk');
AWSMock.setSDKInstance(AWS);

有关此的更多详细信息:Read aws-sdk-mock documentation ,他们已经解释得更好了。

关于node.js - 如何为正在访问 aws 资源的函数编写单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55350667/

相关文章:

node.js - Electron 设置 cookies

amazon-web-services - 在 yaml 模板中未获得正确的输出

arrays - 超测多个request.field数组在服务器上未定义

node.js - 测试 REST API 并使用 EJS 渲染

amazon-web-services - 如何通过 CloudFormation 设置 AWS 对等连接 DNS 解析选项?

javascript - babel 编译时有没有注入(inject)或忽略全局变量的方法?

javascript - Node.JS 中全局变量存储在哪里? Node中有类似窗口的对象吗?

node.js - 带有 sass-loader 的 Webpack 文件加载器

node.js - 使用 DevTools 协议(protocol)在窗口中打开新选项卡

node.js - 使用 sendUsersMessages(javascript SDK)时,AWS Pinpoint 出现 TemplateConfiguration 错误