Использование Amazon DynamoDB с шуткой - как я могу ждать, пока БД не заполнится до запуска тестов? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть приложение nodejs express, использующее AWS Lambda, которое пишет и выполняет поиск в DynamoDB. Я пытаюсь написать интеграционные тесты с использованием Jest и @shelf/jest-dynamodb, но возникают проблемы с очисткой и заполнением БД перед каждым тестовым файлом - это противоречиво, иногда все 3 события заполняются во времени, иногда только 2, а иногда вообще ни одного,Важно, чтобы БД находилась в пустом состоянии в начале каждого тестового файла.

У меня есть файл jest.config:

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

jest-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 тестовых файла:

  • , один из которых проверяет, что моя конечная точка может отправлять на DynamoDB
  • тот, который проверяет, что я могу искать по eventId
  • один, который проверяет, что я могу искать по другим атрибутам

Для первого тестового файла я запускаю 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

И вВ третьем файле я снова очищаю все события и заполняю их тремя событиями:

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 run, чтобы все файлы запускались seвместо параллельно.

...