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);
});
}