javascript - aws-sdk-mock 模拟 s3.putBucketPolicy 不起作用

标签 javascript amazon-s3 jestjs aws-sdk-mock

我有这个功能,我想测试一下。

async function PutBucketPolicy(putBucketPolicyParams) {
  logger.debug("---- PutBucketPolicy");
  return new Promise(async(resolve, reject) => {

    s3.putBucketPolicy(putBucketPolicyParams, function(err, data) {
      if (err)
      {
        resolve(err);
        logger.debug("Error occured!");
        logger.debug(err, err.stack); // an error occurred
      }
      else
      {
        resolve(data);
        logger.debug("Data: ", data);
        logger.debug(data); // successful response
      }
    });
  });
}

我想如何测试它:

describe("Testing PutBucketPolicy function", () => {
  describe("when called with a valid bucket policy object and an event then it", () => {
    it("sets the bucket policy through an aws call.", async() => {

      AWSMock.mock("S3","putBucketPolicy",{ "Body": Buffer.from("somestring") });

      const result = await PutBucketPolicy(helper.putBucketPolicyParams);
      expect( result).toMatchObject(helper.resultPolicyObject);

      AWSMock.restore('S3');

    });
  });
});

问题是它总是返回[ExpiredToken:提供的 token 已过期。],因为模拟本身不起作用,它会尝试走出互联网并执行 s3.putBucketPolicy 函数.

我对此很陌生。我应该怎么做才能让它发挥作用?

最佳答案

您需要在测试方法中初始化S3客户端,如doc中所述。 .

NB: The AWS Service needs to be initialised inside the function being tested in order for the SDK method to be mocked e.g for an AWS Lambda function example 1 will cause an error region not defined in config whereas in example 2 the sdk will be successfully mocked.

Example 1:

const AWS      = require('aws-sdk');
const sns      = AWS.SNS();
const dynamoDb = AWS.DynamoDB();

exports.handler = function(event, context) {
  // do something with the services e.g. sns.publish
}

Example 2

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

exports.handler = function(event, context) {
  const sns      = AWS.SNS();
  const dynamoDb = AWS.DynamoDB();
  // do something with the services e.g. sns.publish
}

Also note that if you initialise an AWS service inside a callback from an async function inside the handler function, that won't work either.

关于javascript - aws-sdk-mock 模拟 s3.putBucketPolicy 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60828331/

相关文章:

javascript - Rails 4,Turbolink 在渲染部分后执行 javascript

java - 将 Maven 依赖项部署到 S3 : No connector available

amazon-web-services - AWS s3 - 触发对象创建,函数被连续调用

javascript - 发生构建错误 ReferenceError : describe is not defined > During now. sh 部署

javascript - 循环遍历两个不同长度的数组

javascript - 创建可重用的模态对象/模板系统

javascript - nodejs 将上传的文件直接传输到S3,无需双重等待时间

javascript - 使用 Jest 进行测试时,是否有更快的方法来重置模拟?

unit-testing - 如何使用 JEST 框架模拟 chrome API?

javascript - 检测 css "flex-box"和 "flex-wrap"支持的正确方法是什么?