【问题标题】:How to mock DynamoDBDocumentClient constructor with Jest (AWS SDK V3)如何使用 Jest 模拟 DynamoDBDocumentClient 构造函数(AWS SDK V3)
【发布时间】:2023-03-09 14:58:01
【问题描述】:

我正在使用 Jest 来模拟我的 AWS 服务,更具体地说是 DynamoDB 和 DynamoDBDocumentClient。

我的代码目前与此类似:

import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"
const ddbClient = new DynamoDBClient({})
const ddbDocumentClient = DynamoDBDocumentClient.from(ddbClient, config)

测试规范如下所示:

jest.mock("@aws-sdk/client-dynamodb", () => ({
  DynamoDBClient: jest.fn(() => ({
    put: (params) => mockAwsResponse("DynamoDBClient", "GetCommand", params),
    put: (params) => mockAwsResponse("DynamoDBClient", "PutCommand", params),
  })),
}))

jest.mock("@aws-sdk/lib-dynamodb", () => ({
  DynamoDBDocumentClient: jest.fn(() => ({
    get: (params) => console.log("In DynamoDBClient get", params),
    put: (params) => mockAwsResponse("DynamoDBDocumentClient", "PutCommand", params),
    from: (params) => mockAwsResponse("DynamoDBDocumentClient", "from", params),
  })),
}))

不幸的是,Jest 给我返回了这个错误:TypeError: lib_dynamodb_1.DynamoDBDocumentClient.from is not a function,我相信这是因为我错误地模拟了DynamoDBDocumentClient,因为它的构造函数是一个静态方法。

提前感谢您的帮助!

编辑:刚刚注意到它使用了适用于 JavaScript 的 AWS SDK v3,如果有帮助的话。

【问题讨论】:

  • 您是否查看过有关模拟 DynamoDBDocumentClient 的其他问题?他们没有解决你的问题吗?
  • 我有,他们没有回答我的问题。我见过的最接近的主题是this 一个,但它与我的情况并不完全匹配。
  • 需要使用DynamoDBDocumentClient.from吗?
  • 这段代码不是我开发的,所以我可能错了。但据我了解,之前的开发人员想要创建一个具有特定配置的DynamoDBDocumentClient,而这需要使用DynamoDBClient,因此他们创建了一个空的并在其中提供config
  • 我想知道完全相同的事情,有什么解决方案吗? @Fares

标签: javascript node.js unit-testing jestjs aws-sdk


【解决方案1】:

在您的示例中,您导入模块并立即运行调用构造函数(在脚本中输入任何方法之前),这意味着您尝试模拟的对象需要在输入任何测试方法之前可用。 尝试在测试之前(和之外)放置模拟,如下所示:

import { DynamoDBClient } from "@aws-sdk/client-dynamodb"
import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"

/* whatever constants you need for your mocks */

jest.mock('@aws-sdk/client-dynamodb', () => {
  return {
    DynamoDBClient: jest.fn().mockImplementation(() => {
      return {};
    }),
  };
});
jest.mock('@aws-sdk/lib-dynamodb', () => {
  return {
    DynamoDBDocumentClient: {
      from: jest.fn().mockImplementation(() => {
        return {
          send: jest.fn().mockImplementation((command) => {
            let res = 'something';
            if(command.name == 'GetCommand'){
               res = 'something else (a constant from earlier...)';
            }
            /* return whatever needs to be returned... */
            return Promise.resolve(res);
          }),
        };
      }),
    },
    /* Return your other docClient methods here too... */
    GetCommand: jest.fn().mockImplementation(() => {
      return { name: 'GetCommand' };
    }),
  };
});

// then you can implement your tests
describe('Endpoint something', () => {
  it('Should pass or something...', async () => {
    /* your test here... */
  });
});

现在您的函数应该可以在需要时使用。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2020-05-06
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多