Я пытаюсь запустить интеграционный тест с помощью redis и jest.
Он всегда выдает ошибку «Jest обнаружил 1 следующий открытый дескриптор, потенциально препятствующий завершению Jest:» при работе с --detectOpenHandles.
Он не зависает, поэтому сокет закрывается, но как мне его написать, чтобы он не выдавал это предупреждение?
Мой код
import redis from 'redis';
let red: redis.RedisClient;
beforeAll(() => {
red = redis.createClient();
});
afterAll((done) => {
red.quit(() => {
done();
});
});
test('redis', (done) => {
red.set('a', 'b', (err, data) => {
console.log(err);
red.get('a', (err, data) => {
console.log(data);
done();
});
});
});
< Сильный > Внимание
Jest has detected the following 1 open handle potentially keeping Jest from exiting:
● TCPWRAP
3 |
4 | beforeAll(() => {
> 5 | red = redis.createClient();
| ^
6 | });
7 |
8 | afterAll((done) => {
at RedisClient.Object.<anonymous>.RedisClient.create_stream (node_modules/redis/index.js:251:31)
at new RedisClient (node_modules/redis/index.js:159:10)
at Object.<anonymous>.exports.createClient (node_modules/redis/index.js:1089:12)
at Object.<anonymous>.beforeAll (src/sockets/redis.integration.test.ts:5:17)
Выполнение скомпилированного кода с обычной шуткой вызывает такое же предупреждение. Скомпилированный код выглядит почти идентично.
2 ответа
Разобрался после публикации. Я забыл опубликовать ответ здесь.
Это связано с тем, как redis.quit()
обрабатывает свой обратный вызов.
Он создает новый поток, поэтому нам нужно дождаться повторного цикла всего стека цикла событий. См. Обходной путь ниже.
async function shutdown() {
await new Promise((resolve) => {
redis.quit(() => {
resolve();
});
});
// redis.quit() creates a thread to close the connection.
// We wait until all threads have been run once to ensure the connection closes.
await new Promise(resolve => setImmediate(resolve));
}
У меня такая же проблема. Я не придумал, как это исправить, но у меня есть обходной путь. Вы можете добавить jest --forceExit
. Для получения информации о forceExit: https://jestjs.io/docs/en/cli.html #forceexit
Похожие вопросы
Новые вопросы
node.js
Node.js - это неблокирующая асинхронная среда ввода-вывода, основанная на событиях, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на клиенте, так и на стороне сервера, и, следовательно, выигрывают от повторного использования кода и отсутствия переключения контекста.