У меня есть приложение 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вместо параллельно.