Я пытаюсь убедиться, что мое приложение должным образом уничтожено после того, как все мои 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 даже запускаются в том же процессе, что и тесты?