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

How to mock AWS S3.getobject() using mocha?

在使用 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() 而是调用原始的,我能做些什么吗?

我可以使用其他方法吗?

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

一个提示:除了模拟单个 S3 响应之外,您还可以利用一些非常复杂的现有模拟框架。例如 moto 提供的功能与实际的 S3 API.

非常相似

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

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