Node.js: Jest + redis.quit (), но предупреждение об открытом дескрипторе сохраняется - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь запустить интеграционный тест с 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 ]

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

разобрался после публикации.Я забыл опубликовать ответ здесь.

Это связано с тем, как redis.quit() обрабатывает свой обратный вызов.

Он создает новый поток, поэтому нам нужно дождаться, пока весь стек Eventloop циклически завершится.снова.См. Ниже для обхода.

async 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));
}
0 голосов
/ 05 февраля 2019

У меня та же проблема.Я не понял, чтобы это исправить, но у меня есть обходной путь.Вы можете добавить jest --forceExit.Для информации о forceExit: https://jestjs.io/docs/en/cli.html#forceexit

...