Jest глобальный демонтаж проходит до окончания испытаний? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь убедиться, что мое приложение должным образом уничтожено после того, как все мои Jest-тесты были запущены, но я сталкиваюсь с очень странным поведением, пытаясь использовать глобальное значение конфигурации Jest для демонтажа.

Вотситуация: мое приложение создает соединение с базой данных.Он также имеет метод destroy, который закрывает соединение с базой данных.Это работает.

У меня есть один тест, который запускает сервер, запускает запрос к соединению с базой данных.В моей глобальной функции разрыва я вызываю app.destroy(), но процесс зависает.

Если я закомментирую вызов destroy в глобальной функции разрыва и добавлю app.destroy() в свой тест после запроса, Jestне висит и закрывается, как положено.Я также могу поместить afterAll(() => app.destroy()) в свой тестовый файл, и все будет работать правильно.

Вот мой jest.config.js

module.exports = {
  testEnvironment: 'node',
  roots: [
    '<rootDir>/src'
  ],
  transform: {
    '^.+\\.tsx?$': 'ts-jest'
  },
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleFileExtensions: [
    'ts',
    'tsx',
    'js',
    'jsx',
    'json',
    'node'
  ],
  globalSetup: '<rootDir>/src/testSetup.ts',
  globalTeardown: '<rootDir>/src/testTeardown.ts'
};

Вот тест (в настоящее время это единственный тест в приложении):

import app from '../..';

describe('User router', () => {
  it('Should respond with an array of user objects', async () => {
    await app.models.User.query();
  });
});

А вот глобальный разрыв в <rootDir>/src/testTeardown.ts:

import app from './index';

module.exports = async function testTeardown() {
  await app.destroy();
};

Используя приведенный выше код, процесс зависает после завершения тестов.Я попытался добавить console.log к testTeardown и конец теста, и журналы располагаются в правильном порядке: журналы тестов, затем журналы демонтажа.Однако, если я добавлю app.destroy() в свой тест, он будет работать отлично:

import app from '../..';

describe('User router', () => {
  it('Should respond with an array of user objects', async () => {
    await app.models.User.query();
    await app.destroy();
  });
});

Это также работает:

import app from '../..';

afterAll(() => app.destroy());

describe('User router', () => {
  it('Should respond with an array of user objects', async () => {
    await app.models.User.query();
  });
});

Почему это происходит?

Также только дляДерьмо и хихиканье Я попытался установить global._app в тесте, а затем проверить его в обработчике разрыва, но это было undefined.Функции установки / разрыва Jest даже запускаются в том же процессе, что и тесты?

1 Ответ

0 голосов
/ 02 февраля 2019

Нет, файлы jest globalSetup и globalTeardown не обязательно запускаются в том же процессе, что и ваши тесты.Это связано с тем, что jest распараллеливает ваши тесты и запускает каждый тестовый файл в отдельном процессе, но для объединенного набора тестовых файлов существует только одна глобальная фаза настройки / демонтажа.

Вы можете использовать setupFiles для добавленияфайл, который запускается в процессе с каждым тестовым файлом.В файле setupFiles вы можете поместить:

afterAll(() => app.destroy());

Ваш Jest-конфиг просто

module.exports = {
  testEnvironment: 'node',
  roots: [
    '<rootDir>/src'
  ],
  transform: {
    '^.+\\.tsx?$': 'ts-jest'
  },
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleFileExtensions: [
    'ts',
    'tsx',
    'js',
    'jsx',
    'json',
    'node'
  ],
  setupFiles: ['<rootDir>/src/testSetup.ts']
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...