Мокко не выходит после теста

Я начинаю с тестов в Node. Использование mocha, chai и nock (для перехвата внешних вызовов HTTP API).

Я написал 3 теста, все они пройдены, однако, когда я добавил третий тест, мокко перестало выходить после запуска тестов, без ошибок или указаний на что-то не так.

Если я прокомментирую 3-й тест, мокко выходит нормально.

Это тест, вызывающий «проблему»:

describe('tokenizer.processFile(req, \'tokenize\')', () => {

    it('should tokenize a file', async () => {

        req = {
            file: {
                originalname: 'randomcards.txt',
                buffer: cardsFile_buffer
            },
            user: {
                displayName: user
            }
        };

        expect(Buffer.from(await tokenizer.processFile(req, 'tokenize'))).to.deep.equal(tokensFile_buffer);

    });

});

Опять же, этот тест - успешный, что сбивает меня с толку.

Вот код tokenizer.processFile:

processFile: function(req, whatTo){

        combinedLogger.info(`Request to ${whatTo} ${req.file.originalname} received. Made by: ${req.user.displayName}`);

        return new Promise(function(resolve, reject){

            const lines = [], responses = [];

            const lineReader = require('readline').createInterface({
                input: require('streamifier').createReadStream(req.file.buffer)
            });

            lineReader.on('line', line => {
                lines.push(line);
            });

            lineReader.on('close', async () => {

                //process every line sequentially

                try {

                    //ensure DB connected to mass insert
                    await db_instance.get_pool();

                    for(const line of lines) {
                        var response;
                        req.current_value = line;
                        if (whatTo == 'tokenize'){

                            response = await Tokenize(line);
                            db_instance.insertAction(req, 'tokenize', response);
                        }
                        else if (whatTo == 'detokenize'){
                            combinedLogger.info(`Request to detokenize ${line} received. Made by: ${req.user.displayName}`);
                            response = await Detokenize(line);
                            db_instance.insertAction(req, 'detokenize', line);
                        }
                        responses.push(response);
                    }

                    resolve(responses.join("\r\n"));

                }
                catch(error){
                    reject(error);
                }
            });

        });

    }

Функции Tokenize (значение) и Detokenize (значение) также вызываются в двух других тестах, при запуске которых мокко завершается нормально.

Есть идеи, что вызывает это?

Версия мокко: 5.1.1

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
58
0
24 669
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В mocha 4.0.0 изменили поведение тестов при доработке. Из здесь:

If the mocha process is still alive after your tests seem "done", then your tests have scheduled something to happen (asynchronously) and haven't cleaned up after themselves properly. Did you leave a socket open?

В вашем случае кажется, что звонок на createReadStream() никогда не закрывался.

Итак, у вас есть 2 варианта:

Вариант А: Закройте fs и другие открытые потоки (рекомендуется)

Вариант Б: Запускаем мокко с опцией --exit.

я собирался сказать это, опция --exit в вашем тесте и все!

PekosoG 22.01.2019 23:59

... как дождаться завершения всех тестов? Моя проблема в том, что я запускаю соединение mongodb в своей функции --delay ... Нет события onTestsDone ...

Ray Foss 08.11.2019 15:37

@RayFoss, я думаю, в этом случае вам нужно использовать метод done (), чтобы указать, что ваш тестовый пример завершен ... Проверьте: medium.com/caffeine-and-testing/…

Alex Mantaut 10.11.2019 22:55

Такое поведение может быть действительно полезным, и я бы не рекомендовал принудительно завершать тесты. Обычно, когда мокко зависает и не выходит, в вашем коде есть что-то, что нужно очистить. Лучше найти проблему. Таким образом я обнаружил много потенциальных утечек.

reads0520 17.01.2020 20:22

Так что, если тест просто зависает, а я не использую createReadStream?

Andrew Koster 23.05.2020 04:53

Это спасло мне жизнь!

Tony Mathew 09.07.2020 13:50

Я использовал npmjs.com/package/why-is-node-running, чтобы выяснить, почему мое приложение узла все еще работает.

Martin P. 05.10.2020 22:41

Добавление флага --exit в тестовый скрипт в package.json помогло мне

Onengiye Richard 09.05.2021 17:43

Не пытайтесь закрыть или побеждать такое поведение. В моем случае драйвер MongoDB был оставлен открытым, и в результате тест продолжался, как упоминалось в @ reads0520.

Manabu Tokunaga 11.06.2021 01:16

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