使用 Jest 和 Typescript 模拟 DynamoDB.DocumentClient 的构造函数

时间:2020-12-29 08:07:09

标签: typescript unit-testing jestjs aws-sdk-js

在我的 TypeScript 应用程序中,我在 AWS SDK DynamoDB 的 INV_DATE DATE DEFAULT SYSDATE NOT NULL, 函数上有包装函数,我想为这些包装函数编写一些单元测试。包装函数实现如下:

DocumentClient

我不想在 DDB 表中执行任何实际的端到端放置/获取,而只是模拟 AWS 开发工具包函数。但是,我在模拟 dynamodb.ts import DynamoDB from 'aws-sdk/clients/dynamodb' import AWS from 'aws-sdk/global'; const config: DynamoDB.Types.ClientConfiguration = { httpOptions: { connectTimeout: 500, timeout: 1000, } } const service = new DynamoDB(config); const ddb = new DynamoDB.DocumentClient({ service }); export const putItem = wrap(ddb.put.bind(ddb)); const wrap = <I, O>(fnc: (args: I) => AWS.Request<O, AWS.AWSError>) => (args: I) => { return fnc(args).promise() .then(result => { log(result); return result; }); }; DynamoDB 的构造函数时遇到了一些问题。

目前我的单元测试文件是这样的:

DynamoDB.DocumentClient

运行这个测试给了我一个这样的错误:

dynamodb.test.ts

import * as sut from "../dynamodb"
import DynamoDB from "aws-sdk/clients/dynamodb";


jest.mock("aws-sdk/clients/dynamodb", () => {
  return jest.fn().mockImplementation(() => {
    const documentClient = jest.fn().mockImplementation(() => {
        const awsSdkPromiseResponse = jest.fn().mockReturnValue(Promise.resolve(true));
        const putFn = jest.fn().mockImplementation(() => ({promise: awsSdkPromiseResponse}))
        return {
          put: putFn,
          get: putFn,
          delete: putFn,
          batchGet: putFn,
          batchWrite: putFn,
          query: putFn,
          scan: putFn,
          update: putFn,
          transactGet: putFn,
          transactWrite: putFn
        }
    })
    return { DocumentClient: documentClient };
  });
});

test('AWS.DynamoDB is called', async() => {
  await sut.putItem({
    TableName: 'test',
    Item: {
      pk: 'test_pk',
      sk: 'test_sk',
      email: 'test@test.com'
    }
  })
  expect(DynamoDB).toHaveBeenCalledTimes(1)
})

似乎 TypeError: _dynamodb.default.DocumentClient is not a constructor 是位于命名空间 DocumentClient 中的静态属性,我在上面模拟 DynamoDB 中尝试做的是将 DynamoDB 定义为DocumentClient 类的实例属性。我知道这是不正确的,我已经在互联网上搜索类似的东西,但找不到任何东西。

问题还在于我想在我的测试文件中模拟 DynamoDBDynamoDB 类的构造函数。我发现一个 article 类似于我正在尝试做的,但这里的手动模拟也无济于事。通过这个,我无法同时模拟 DocumentClientDynamoDB

的构造函数

我对 TypeScript 很陌生,也许我正在做一些完全愚蠢的事情。任何指针表示赞赏!

0 个答案:

没有答案