首页 > 解决方案 > 将 Amazon DynamoDB 与 jest 一起使用 - 如何在测试运行之前等待数据库填充?

问题描述

我有一个使用 AWS Lambda 的 nodejs express 应用程序,它可以写入和搜索 DynamoDB。我正在尝试使用 Jest 和 编写集成测试@shelf/jest-dynamodb,但是在每个测试文件运行之前清除和填充数据库时遇到问题 - 它不一致,有时所有 3 个事件都及时填充,有时只有 2 个,有时根本没有。在每个测试文件开始时数据库处于空状态是很重要的。

我有一个jest.config文件:

module.exports = {
  preset: '@shelf/jest-dynamodb',
};

笑话-dynamodb-config.js

module.exports = {
  tables: [
    {
      TableName: 'DB',
      KeySchema: [{ AttributeName: 'eventId', KeyType: 'HASH' }],
      AttributeDefinitions: [{ AttributeName: 'eventId', AttributeType: 'S' }],
      ProvisionedThroughput: { ReadCapacityUnits: 1, WriteCapacityUnits: 1 },
    },
  ],
  endpoint: 'http://docker.for.mac.localhost:8000',
};

我有一个 dbHelper.js

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

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

const populateDb = async (event) => {
  await ddb.put({ TableName: 'DB', Item: event }, (err, res) => {
    if (err) {
      logger.error(`populateDb ERROR: ${err}`);
    } else {
      logger.info('populateDb OK!');
    }
  });
};

const clearDb = async (event) => {
  await ddb.delete({ TableName: 'DB', Key: { eventId: event.eventId } }, (err, res) => {
    if (err) {
      logger.error(`clearDb ERROR: ${err}`);
    } else {
      logger.info('clearDb OK!');
    }
  });
};

module.exports = {
  populateDb,
  clearDb,
};

我有 3 个测试文件:

对于第一个测试文件,我运行 beforeAll() 应该清除表中可能存在的任何内容:

beforeAll(async () => {
    jest.setTimeout(JEST_TIMEOUT);

    await clearDb(eventA)
    await clearDb(eventB)
    await clearDb(eventC)
  });

// then run tests - only 1 event is actually written so I collect the eventId (as it is created randomly) and clear in afterAll()

afterAll(async () => {
          await clearDb(response.data)
        })

对于第二个文件,我再次清除其中可能存在的所有模拟事件并填充一个事件:

beforeAll(async () => {
    jest.setTimeout(JEST_TIMEOUT);

    await clearDb(eventA)
    await clearDb(eventB)
    await clearDb(eventC)

    await populateDb(eventA)
});

// run tests

在第三个文件中,我再次清除所有事件并填充 3 个事件:

beforeAll(async () => {
    jest.setTimeout(JEST_TIMEOUT);

    await clearDb(eventA)
    await clearDb(eventB)
    await clearDb(eventC)

    await populateDb(eventA)
    await populateDb(eventB)
    await populateDb(eventC)
  });

// run tests

我已经向我的 dbHelper 函数添加了回调,以尝试确保函数在继续之前完成,但这似乎不起作用。

我还在-i我的 jest 运行命令中添加了标志,因此所有文件都按顺序运行,而不是并行运行。

标签: node.jsaws-lambdajestjsintegration-testingdynamo-local

解决方案


推荐阅读