gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:48:37 24 4
gpt4 key购买 nike

我有一个函数正在访问多个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com