node.js - 将 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 个测试文件:
- 测试我的端点的一个可以发布到 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 运行命令中添加了标志,因此所有文件都按顺序运行,而不是并行运行。
解决方案
推荐阅读
- c# - PostAsync API 提供了错误的网关
- python - 导入 xgboost 模块时出现问题(错误消息:['[WinError 193] %1 is not a valid Win32 application'])
- python - 如何从行到列打印某些特定字符?
- python - 将动态加载的函数提交给 ProcessPoolExecutor
- c# - 确定已安装的 ASP.NET Core Hosting Bundle 版本
- html - 从一个点缩小和放大文本
- javascript - 允许字母数字、特殊字符和空格的正则表达式
- css - 如何在 Internet Explorer 7 中重塑为 2 列
- azure - 我在 Azure Kubernetes 服务的微服务基础结构中收到错误 500 转发错误
- r - 相乘结果回归 R