Sequelize и Jest не очень хорошо играют вместе - PullRequest
0 голосов
/ 23 января 2019

Чтобы быть более конкретным, я использую функции / файлы 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...');
  }
};

1 Ответ

0 голосов
/ 30 июля 2019

У меня была проблема, похожая на вашу, я исправил ее, закрыв соединение db в конце всех тестов.

Экспортируйте свою базу данных в файл конфигурации базы данных и импортируйте ее в свой тестовый класс, после чего вы можете закрыть соединение в конце всех тестов.

afterAll(() => {
    db.close()
})

Примечание: когда вы удаляете все схемы, он удаляет все таблицы (для postgres db), вместо этого закрывает соединение после каждого набора тестов.

...