6

我有一个看起来像这样的函数:

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 })
}

我想测试功能连接。我已经像这样模拟了 DynamoDB 构造函数:

// See https://stackoverflow.com/questions/47606545/mock-a-dependencys-constructor-jest
jest.mock('aws-sdk', () => {
  const DynamoDB = jest.fn().mockImplementation(() => {
    return {};
  });
  return {
    DynamoDB,
  };
});

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

4

5 回答 5

6

这对我有用:

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

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

我希望它对你也有帮助。

问候,

大卫。

于 2020-03-01T18:51:12.250 回答
4

基于上面 duxtinto 的评论:

在我的情况下(如果我没看错的话,在 OP 的情况下),DynamoDB 没有被称为函数,而是一个带有 DocumentClient 字段的对象,所以这对我有用:

jest.mock('aws-sdk', () => {
  return {
    DynamoDB: { // just an object, not a function
      DocumentClient: jest.fn(() => ({
        put: mockDynamoDbPut
      }))
    }
  }});
于 2021-06-07T18:37:58.003 回答
3

DocumentClient might call some of the client method, so simply define those methods stub. Say for example, DocumentClient would use batchGetItem, in your code

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({ ... }));
于 2019-09-07T18:06:20.360 回答
1

这对我使用 Jest 和 TypeScript 有用:

// blabla.test.ts
import { DynamoDB } from 'aws-sdk';
import { ConsumerClass } from '../consumer-class';
import { DependencyConsumerClass } from '../dependency-consumer-class';

/*
* Inside consumerClassInstance.save() is calling this.dynamo.putItem({...}).promise();
*/
jest.mock('aws-sdk', () => {
    return {
        DynamoDB: jest.fn(() => {
            return {
                putItem: jest.fn(() => {
                    return {
                        promise: jest.fn(() => true)
                    };
                })
            };
        })
    };
});

test('sample test', async () => {
    const dependencyConsumerClass = new DependencyConsumerClass();
    const consumerClassInstance = new ConsumerClass(dependencyConsumerClass, new DynamoDB());
    
    const result = await consumerClassInstance.save();
    console.log(result);
});
于 2020-09-25T13:46:24.267 回答
0

Jest 为运行测试提供 DynamoDB 集成。看这个文件,看看3. Configure DynamoDB client

const {DocumentClient} = require('aws-sdk/clients/dynamodb');

const isTest = process.env.JEST_WORKER_ID;
const config = {
  convertEmptyValues: true,
  ...(isTest && {endpoint: 'localhost:8000', sslEnabled: false, region: 'local-env'})
};

const ddb = new DocumentClient(config);

我想你可以将 DynamoDB 客户端配置抽象出来(如果你还没有)到它自己的模块文件中并导出该客户端,以便在其他地方需要它,并且当 Jest 测试运行时,客户端被配置为指向模拟您根据 Jest DynamoDB 文档的其他步骤设置的 DynamoDB 服务器/表。

于 2020-06-16T11:23:04.910 回答