Я использую 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();
});
});
не забудьте посмотреть на "запрошенную" дату ..






У меня была такая же проблема, но в моем файле package.json я добавил "test": "jest --detectOpenHandles" и запустил npm test --detectOpenHandles. На этот раз я не получил сообщения об ошибке. Может, ты попробуешь это сделать.
Думаю, --runInBand, который неявно установлен с помощью --detectOpenHandles, исправил проблему в этом случае.
Это должно быть предложение для определения того, что вызывает проблему, но не для ее решения.
Это просто подавляет сообщение об ошибке, потому что включает диагностику - он ничего не делает для устранения ошибки и не позволяет тестам завершиться успешно.
Моя проблема была решена этим кодом:
beforeAll(done => {
done()
})
afterAll(done => {
// Closing the DB connection allows Jest to exit successfully.
mongoose.connection.close()
done()
})
У меня была такая же проблема, только с mysql. Я закрыл соединение с mysql, и он работает. Спасибо
Для меня это была другая проблема, я использовал супертест для тестирования самих маршрутов, поэтому мне пришлось закрыть соединение с самим сервером.
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 за пределы файла работает?
Это было для меня, спасибо. Я использую функцию запроса из супертеста, и ей не нужен сервер для запуска, поэтому я отделил от него app.listen. Также вот полный пример такого разделения для будущих читателей: tutorialedge.net/typescript/…
Это сработало для меня
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
app = require('./index')запускает ли сервер прослушивание порта? в идеале ваш сервер должен быть настроен так, чтобы его можно было импортировать без фактического запуска, что вы и хотите сделать в данном случае. Это также может решить вашу проблему.