使用 jest 模拟 AWS.DynamoDB.DocumentClient 的构造函数

vam*_*olu 9 amazon-dynamodb typescript jestjs aws-sdk-nodejs ts-jest

我有一个如下所示的函数:

function connect() {
   const secret = 'secret';
   const key = 'key';
   const region = 'region';
   const client = new AWS.DynamoDB({
      secret,
      key,
      region
   });'
   return new AWS.DynamoDB.DocumentClient({ service: client })
}
Run Code Online (Sandbox Code Playgroud)

我想测试一下连接功能。我像这样嘲笑了 DynamoDB 构造函数:

// See /sf/ask/3332458181/
jest.mock('aws-sdk', () => {
  const DynamoDB = jest.fn().mockImplementation(() => {
    return {};
  });
  return {
    DynamoDB,
  };
});
Run Code Online (Sandbox Code Playgroud)

然而,这意味着DocumentClient构造函数失败。我又该如何嘲笑呢?

dpm*_*ott 10

基于上面 duxtinto 的评论:

就我而言(如果我没读错的话,就 OP 而言),DynamoDB 不是作为函数调用的,而是一个带有 DocumentClient 字段的对象,所以这对我有用:

jest.mock('aws-sdk', () => {
  return {
    DynamoDB: { // just an object, not a function
      DocumentClient: jest.fn(() => ({
        put: mockDynamoDbPut
      }))
    }
  }});
Run Code Online (Sandbox Code Playgroud)


小智 7

这对我有用:

const mockDynamoDbPut = jest.fn().mockImplementation(() => {
  return {
    promise() {
      return Promise.resolve({});
    }
  };
});

jest.doMock('aws-sdk', () => {
  return {
    DynamoDB: jest.fn(() => ({
      DocumentClient: jest.fn(() => ({
        put: mockDynamoDbPut
      }))
    }))
  };
});
Run Code Online (Sandbox Code Playgroud)

我希望它对你也有帮助。

问候,

大卫。

  • 这给了我错误“ConfigError:配置中缺少区域”。任何想法,将不胜感激! (3认同)
  • 就我而言(如果我没读错的话,就 OP 而言),DynamoDB 不是作为函数调用的,而是一个带有 DocumentClient 字段的对象,所以这对我有用:` jest .mock('aws-sdk', () => { return { DynamoDB: { // 只是一个对象,而不是函数 DocumentClient: jest.fn(() => ({ put: mockDynamoDbPut })) } }}) ; ` (2认同)

sea*_*ong 5

DocumentClient可能会调用某些client方法,因此只需定义这些方法存根即可。例如,在您的代码中DocumentClient使用,batchGetItem

import AWS from 'aws-sdk';

jest.mock('aws-sdk', () => {
  const DynamoDB = jest.fn().mockImplementation(() => {
    return {
      batchGetItem: jest.fn(),
    };
  });
  return {
    DynamoDB,
  };
});

// you could inspect the mock
console.log(new AWS.DynamoDB({ ... }));
Run Code Online (Sandbox Code Playgroud)