我们正在使用带有 Sequelize 的 Umzug 库,我们希望将其用于测试,但我们的问题是在运行第一个测试套件后我们无法使数据库清洁。也许我们误解了它的一些原则。
在运行多个测试套件之前如何准备测试数据库,这需要重新创建完全干净的数据库并再次加载夹具?欢迎任何提示和技巧。
到目前为止我们的代码(但它不能正确清理数据库)
describe('Create user password mutation - SUCCESS', () => {
afterAll(async (done) => {
const dbModelsService = testService.getService(services.MODELS);
const sequelizeService = testService.getService(services.SEQUELIZE);
const sequelizeSetupOpts = getSequelizeSetupOpts(dbModelsService);
const umzug = getUmzugOptions(dbModelsService, sequelizeService);
await resetDbMigrations(sequelizeService, umzug);
await setupDevDb(sequelizeService, sequelizeSetupOpts, umzug, dbModelsService, true);
done();
});
export const getSequelizeSetupOpts = (dbModels) => {
return {
models: dbModels,
migrationsPath: '/app/lib/sequelize/migrations',
fixtures: dbFixtures, // this is array of fixtures
init: false,
};
};
export const resetDbMigrations = async (sequelizeService, umzug) => {
try {
await sequelizeService.query('SET FOREIGN_KEY_CHECKS = 0');
await resetMigrations(umzug);
// await dbHardReset();
} catch (e) {
log.e('There occured an error when migrations were dropped down to 0.', e);
} finally {
await sequelizeService.query('SET FOREIGN_KEY_CHECKS = 1');
}
};
export const setupDevDb = async (sequelizeService, sequelizeSetupOpts, umzug, dbModels, init = false) => {
// Set up test database and load fixtures
return runMigrations(umzug)
.then(() => {
if (init) {
// return destroyModels(sequelizeService, dbModels);
}
return null;
})
.then(() => {
if (init) {
return loadFixtures(sequelizeSetupOpts);
}
return null;
})
.catch((e) => {
log.e('There occured an error while running migrations with destroying models and loading fixtures.', e);
throw e;
});
};
function runMigrations(umzug) {
// eslint-disable-next-line no-unused-vars
return umzug
.up()
.then((migrations) => {
console.info(`Running ${migrations.length} migrations...`);
})
.catch((err) => {
log.e('Error while running migrations: ', err);
});
}