【问题标题】:Mocking promise from DynamoDB Documentclient: The security token included in the request is invalid来自 DynamoDB Documentclient 的模拟承诺:请求中包含的安全令牌无效
【发布时间】:2019-12-30 13:26:04
【问题描述】:

我正在使用 aws-sdk-mock 为 aws-dynamodb 运行一些单元测试用例。但我得到以下错误:

UnrecognizedClientException:安全令牌包含在 请求无效

这是我的代码的样子。

// Code:
async getUser(email) {
    const params = {
      TableName: 'test',
      Key: {
        email: email
      }
    };
    return await docClient.get(params).promise();
}

这是我当前的测试结果:

// Testcase:
it('Get all categories data successfully', async done => {
      AWSMock.setSDKInstance(AWS);
      AWSMock.mock('DynamoDB.DocumentClient', 'get', (params, callback) => {
        callback(null, { Item: { 
            email: 'test@test.com',
            name: 'Test profile'
          }
        });
      });
      const response = await service.getUserProfile(eventStub.headers.email);
      expect(response).to.equal({Items: { 
            email: 'test@test.com',
            name: 'Test profile'
          }});;
      AWSMock.restore('DynamoDB.DocumentClient');
      done();
});
UnrecognizedClientException: The security token included in the request is invalid

      at Request.extractError (node_modules/aws-sdk/lib/protocol/json.js:51:27)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:106:20)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:683:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:14:12)
      at node_modules/aws-sdk/lib/state_machine.js:26:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:685:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:683:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:14:12)
      at node_modules/aws-sdk/lib/state_machine.js:26:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:685:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at IncomingMessage.onEnd (node_modules/aws-sdk/lib/event_listeners.js:307:13)

【问题讨论】:

    标签: amazon-web-services


    【解决方案1】:

    我知道这是一个迟到的答案,但为了其他发现此问题的人:

    根据 aws-sdk-mock readme,请参阅实例化 AWS 服务示例部分。 AWS 服务需要在被测试的函数中实例化。

    来自readme

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

    在您的示例中,您可能需要这样做:

    async getUser(email) {
      // instantiate the service inside the function being tested in order for aws-sdk-mock
      // to mock it successfully
      if(process.env.NODE_ENV === 'test')
        docClient = new AWS.DynamoDB.DocumentClient()
      const params = {
        TableName: 'test',
        Key: {
          email: email
        }
      };
      return await docClient.get(params).promise();
    }
    

    我也犯了这个错误。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 2015-07-06
      • 2018-04-09
      • 2021-06-22
      • 2021-11-02
      • 1970-01-01
      相关资源
      最近更新 更多