【问题标题】:aws-sdk-mock mocking an s3.putBucketPolicy does not workaws-sdk-mock 模拟 s3.putBucketPolicy 不起作用
【发布时间】:2020-03-24 09:38:01
【问题描述】:

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

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: The provided token has expired.] 因为模拟本身不起作用,它会尝试上网并执行 s3.putBucketPolicy 函数.

我是新手。我应该怎么做才能让它发挥作用?

【问题讨论】:

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


    【解决方案1】:

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

    注意:AWS 服务需要在函数内部初始化 测试以模拟 SDK 方法,例如用于 AWS Lambda 函数示例 1 将导致配置中未定义的错误区域 而在示例 2 中,sdk 将被成功模拟。

    示例 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
    }
    

    示例 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
    }
    

    还要注意,如果你初始化一个 AWS 服务内部的异步函数回调 处理函数,这也不起作用。

    【讨论】:

    • 我已将其添加到函数中: const s3 = new aws.S3({ apiVersion: '2006-03-01' });并将其放入测试函数中: const s3 = new AWS.S3({paramValidation: true});现在它可以工作了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2021-06-01
    • 2020-08-13
    • 2020-12-16
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多