node.js - 在 Node 中使用 Mocha 对 AWS S3 功能进行单元测试

标签 node.js unit-testing amazon-s3 mocha.js

在 Node.js 中进行单元测试时如何模拟 S3 调用?我想确保该函数经过单元测试,而不实际调用 S3。我想测试一下如果一切按预期进行以及是否出现错误会发生什么。我认为 Sinon 是首选工具,但我不确定如何?

我的 s3 文件是:

const AWS = require('aws-sdk');

AWS.config.region = 'ap-southeast-2';
const s3 = new AWS.S3();
const { S3_BUCKET } = process.env;
const propertyCheck = require('./utils/property-check');

module.exports.uploadS3 = (binary, folderName, fileName) => new Promise((resolve, reject) => {
    if (!propertyCheck.valid(binary) ||
        !propertyCheck.validString(folderName) ||
        !propertyCheck.validString(fileName)) {
        const error = '[uploadS3] Couldn\'t upload to S3 because of validation errors.';
        console.error(error);
        return reject(new Error(error));
    }
    const finalUrl = `${encodeURIComponent(folderName)}/${encodeURIComponent(fileName)}`;
    s3.putObject({
        Body: binary,
        Key: finalUrl,
        Bucket: S3_BUCKET,
        ContentType: 'application/pdf',
        ContentDisposition: 'inline',
        ACL: 'public-read'
    }, (error, data) => {
        if (error) {
            console.error(error);
            return reject(new Error(`[uploadS3] ${error}`));
        }
        resolve(`https://${S3_BUCKET}.s3.amazonaws.com/${finalUrl}`);
    });
});

最佳答案

使用Sinon是一个不错的选择。

您可以使用 aws-sdk-mock,因为它可以节省一些与设置模拟相关的工作,但您可能会发现自己同时使用两者。

链接到 aws-sdk-mock: https://www.npmjs.com/package/aws-sdk-mock )

<小时/>

顺便说一句,您可以使用大多数 aws-sdk API 上的 .promise() 替换手动创建 Promise。

文档链接: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-property

关于node.js - 在 Node 中使用 Mocha 对 AWS S3 功能进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47089671/

相关文章:

javascript - 返回 Promise.all 不执行提供的 Promise

node.js - 如何在 Node 中检查模块是否存在以及是否存在要加载?

javascript - 通过实习生对浏览器 CommonJS 模块进行单元测试

c# - 如何在我的集成测试中使用 IConfiguration?

Javascript - 通过预签名 URL 将 CSV 上传到 S3 - 文件包含边界数据

javascript - 使用nodejs将文件上传到s3

node.js - 构建 Restful API 时选择哪种 HTTP 方法

javascript - 带有 collection2 的 Meteor Autoform 包不提交表单

php - 断言对象值在 PHPUnit 中的范围内

ruby-on-rails - 亚马逊S3 : set permissions using aws-sdk-ruby