web-dev-qa-db-fra.com

Le moka ne sort pas après le test

Je commence par des tests dans Node. Utilisation de mocha, chai et nock (pour intercepter les appels externes HTTP api).

J'ai écrit 3 tests, tous sont une réussite, cependant, lorsque j'ai ajouté le 3ème test, mocha a cessé de sortir après l'exécution des tests, sans erreur ni indication de problème.

Si je commente le 3ème test, moka sort très bien.

C'est le test à l'origine du "problème":

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);

    });

});

Encore une fois, ce test est une réussite, ce qui me déconcerte.

Voici le code de 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);
                }
            });

        });

    }

Les fonctions Tokenize (valeur) et Detokenize (valeur) sont également appelées dans les 2 autres tests, qui lors de l'exécution, mocha se termine très bien.

Une idée de ce qui cause ça?

Version moka: 5.1.1

14
Fede E.

Je sais qu'il est un peu tard pour répondre à cette question, mais j'étais confronté à un problème similaire et j'ai vu votre message.

Dans mocha 4.0.0, ils ont changé le comportement des tests sur la finalisation. De ici :

Si le processus mocha est toujours actif après que vos tests semblent "terminés", alors vos tests ont planifié quelque chose (asynchrone) et ne se sont pas nettoyés correctement après eux-mêmes. Avez-vous laissé une prise ouverte?

Dans votre cas, il semble qu'un appel à createReadStream() n'ait jamais été fermé.

Donc, vous avez 2 options:

Option A: Fermez les fs et autres flux ouverts (recommandé)

Option B: Exécutez mocha avec le --exit option.

27
Alex Mantaut