如何使用mocha模拟AWS S3.getobject()?

时间:2016-12-26 10:57:44

标签: amazon-web-services testing amazon-s3 mocha aws-lambda

在使用mocha的测试期间,我遇到了S3.getObject()的调用问题。

我在Lambda中的代码是这样的:

index.js:(在AWS Lambda函数内部)

S3.getObject(s3FileParams, function(err, data) {
    if (err) {
        var message = "Error while trying to get file object " + fullFileName + " from bucket " + bucketName + ". Make sure they exist and your bucket is in the same region as this function. Error: " + err;
        console.error(message);
    }
    else {
        userMetaDataJson = data.Metadata;
    }
    resolve();
})

并在测试文件中 index.test.js (使用mocha)

AWSMock.mock('S3', 'getObject', function (params, callback){
    var metaDataParams = {
        "Metadata": {
            "startDate": "2016-11-11 12:34:56:000",
            "endDate":   "2016-11-11 12:34:56:000",
            "userName":  "userName",
            "originalFileName": "originalFileName"
        }
    };
    callback(false, metaDataParams);
});

当使用mocha运行此测试时,没有调用模拟的getObject()并且它正在调用原始的那个,有什么我可以做的吗?

我可以使用其他方法吗?

2 个答案:

答案 0 :(得分:1)

解决方案是在我的AWS Lambda中创建S3实例而不是全局变量

答案 1 :(得分:0)

一个提示:您可以利用一些非常复杂的现有模拟框架,而不是模拟单个S3响应。例如,moto提供的功能与实际的S3 API非常相似。

您还可以查看LocalStack,这是一个结合了现有工具的框架,可提供可用于集成测试的全功能本地云环境(包括S3)。

虽然其中一些工具是用其他语言编写的(Python),但是从node.js测试开始在外部进程中调试测试环境应该很容易。