Jest не завершился через одну секунду после завершения тестового запуска с использованием экспресс

Я использую JEST для модульного тестирования своих экспресс-маршрутов.

При запуске yarn test все мои тесты проходят успешно, но я получаю сообщение об ошибке

Jest did not exit one second after the test run has completed.

This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.

Я использовал async и done, но все равно возникает указанная выше ошибка.

Ниже мой код спецификации. Пожалуйста помоги

routes.spec.ts

const request = require('supertest');
describe('Test the root path', () => {
  const app = require('./index');

  test('GET /gql/gql-communication-portal/release-notes', async (done) => {
    const response = await request(app).get('/gql/gql-communication-portal/release-notes');
    expect(response.status).toBe(200);
    done();
  });
});
app = require('./index') запускает ли сервер прослушивание порта? в идеале ваш сервер должен быть настроен так, чтобы его можно было импортировать без фактического запуска, что вы и хотите сделать в данном случае. Это также может решить вашу проблему.
lecstor 06.03.2019 00:04

не забудьте посмотреть на "запрошенную" дату ..

lecstor 06.03.2019 01:04
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
43
2
50 413
8

Ответы 8

У меня была такая же проблема, но в моем файле package.json я добавил "test": "jest --detectOpenHandles" и запустил npm test --detectOpenHandles. На этот раз я не получил сообщения об ошибке. Может, ты попробуешь это сделать.

Думаю, --runInBand, который неявно установлен с помощью --detectOpenHandles, исправил проблему в этом случае.

yunabe 22.09.2019 03:55

Это должно быть предложение для определения того, что вызывает проблему, но не для ее решения.

Raphael G. Frantz 04.10.2020 00:28

Это просто подавляет сообщение об ошибке, потому что включает диагностику - он ничего не делает для устранения ошибки и не позволяет тестам завершиться успешно.

Chris Halcrow 16.03.2021 03:59

Моя проблема была решена этим кодом:

beforeAll(done => {
  done()
})

afterAll(done => {
  // Closing the DB connection allows Jest to exit successfully.
  mongoose.connection.close()
  done()
})

У меня была такая же проблема, только с mysql. Я закрыл соединение с mysql, и он работает. Спасибо

rscata 13.05.2020 11:13

Для меня это была другая проблема, я использовал супертест для тестирования самих маршрутов, поэтому мне пришлось закрыть соединение с самим сервером.

afterAll(done => {
    server.close();
    done();
});

Если это не ваш случай, у Эта проблема может быть что-то для вас

Со своей стороны, я просто отделяю app.listen() от своего приложения. Итак, с экспрессом ваше приложение завершает экспорт.

// index.js
module.exports = app;

И просто создайте еще один файл для прослушивания порта.

// server.js
const app = require('./index')
app.listen(...)

И если вы импортируете только индекс (приложение index.js) в свои тесты, он должен работать без дополнительной конфигурации. Конечно, вам нужно настроить запуск экспресс-приложения. Теперь он должен использовать server.js.

Спасибо! вы знаете, почему перемещение app.listen за пределы файла работает?

nkhil 11.02.2021 20:50

Это было для меня, спасибо. Я использую функцию запроса из супертеста, и ей не нужен сервер для запуска, поэтому я отделил от него app.listen. Также вот полный пример такого разделения для будущих читателей: tutorialedge.net/typescript/…

aderchox 17.12.2021 00:09

Это сработало для меня

const mongoose = require('mongoose');
    afterAll(async(done) => {
  // Closing the DB connection allows Jest to exit successfully.
  try {
    await mongoose.connection.close();
    done()
  } catch (error) {
    console.info(error);
    done()
  }
  // done()
})

Для Firebase мне пришлось вызвать cleanup ()

import {
    assertFails,
    assertSucceeds,
    initializeTestEnvironment,
    RulesTestEnvironment,
} from "@firebase/rules-unit-testing";
import { doc, setDoc } from "firebase/firestore";

it('creates a new user document in firebase', async () => {
    const testEnv = await initializeTestEnvironment({
        projectId: "appname-test",
        firestore: {
            host: 'localhost',
            port: 8088
        }
    });

    const alice = testEnv.authenticatedContext("alice");

    await assertSucceeds(setDoc(doc(alice.firestore(), "users", "alice"), {
        fname: "Alice",
        lname: "Wonderland",
        dob: "18/01/1999",
        email: "[email protected]"
    }));

    return await testEnv.cleanup();
});

Добавление

jest.useFakeTimers();

в начале набора тестов исправил для меня.

Могут поступать из таймеров, определенных в компонентах рендеринга (например, регулируемые кнопки, макеты и т. д.).

Я добавил эту строку в package.json

Это сработало для меня

jest --runInBand --detectOpenHandles --forceExit

Другие вопросы по теме