我有一个使用 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 个测试文件:
- 测试我的端点的一个可以发布到 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
在第三个文件中,我再次清除所有事件并填充 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 运行命令中添加了标志,因此所有文件都按顺序运行,而不是并行运行。