Чтобы быть более конкретным, я использую функции / файлы globalSetup
и globalTeardown
Jest для настройки моей базы данных один раз в начале, а затем также для закрытия и удаления таблиц в конце.
Это на самом деле не лучшее решение, но, к сожалению, это единственное решение, которое даже удаленно работает без ошибок. В идеале я хотел бы иметь возможность установить соединение с базой данных один раз, а затем удалять / очищать таблицы и заново создавать их после каждого набора тестов. Обычно, с другими базами данных (особенно Mongoose / NoSQL), это может быть выполнено без проблем beforeAll/Each
и afterAll/Each
в Jest, но, к сожалению, это приводит к большому количеству ошибок с Sequelize, особенно в том, что он пытается восстановить базу данных подключение каждый раз, что приводит к большому количеству ошибок порта / прослушивания.
Причина, по которой я говорю, что моя текущая настройка использования глобальных файлов "своего рода" работает, заключается в том, что часть установки работает отлично, а часть разрыва, AKA await db.dropAllSchemas({});
, вообще не работает. Таблицы сохраняются на протяжении всех тестов, если я не стираю их вручную.
Если у кого-то есть опыт работы с этим, я в идеале хотел бы получить решение, которое я опубликовал в первой части, но в худшем случае я бы хотел исправить то, что у меня есть, чтобы оно отбрасывало таблицы в конце всех тестов.
Это код, который я использую, чтобы попытаться достичь ПЕРВОГО решения (без глобальных файлов), и который вызывает все ошибки;
setupTestFramework.js
import { db } from '../../src/startup/database';
beforeAll(async () => {
await db.sync();
});
afterAll(async () => {
await db.dropAllSchemas({});
});
Этот код приводит к ошибкам;
SequelizeDatabaseError: Table 'db_tests.products' doesn't exist
Это также приводит к некоторому разбросу в тестах. Некоторые из начальных тестов проходят (в основном 1-2 и, вероятно, потому что они находятся на одном и том же соединении с БД), но после них все тесты не пройдены.
Надеюсь, кто-нибудь может помочь, потому что я не смог найти достойного решения для этого.
EDIT:
database.js
import config from 'config';
import Sequelize from 'sequelize';
import { info } from 'winston';
export const db = new Sequelize(
config.get('db.database'),
config.get('db.username'),
config.get('db.password'),
{
host: config.get('db.host'),
port: config.get('db.port'),
dialect: 'mysql',
operatorsAliases: false,
logging:
process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'test' ? null : console.log,
}
);
export default async () => {
try {
await db.authenticate();
info('Connected to database successfully...');
await db.sync();
} catch (error) {
throw new Error('Unable to connect to database...');
}
};