0

我有我想测试的这个功能。

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 函数。

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

4

1 回答 1

1

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

注意: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 服务,那也不起作用。

于 2020-03-24T09:41:47.860 回答