Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocha not exiting after test

I'm starting with tests in Node. Using mocha, chai and nock (to intercept external HTTP api calls).

I have written 3 tests, all of them are a pass, however, when I added the 3rd test, mocha stopped exiting after running the tests, with no error or indication of anything wrong.

If I comment the 3rd test, mocha exits just fine.

This is the test causing the 'issue':

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

    });

});

Again, that test is a pass, which baffles me.

Here's the code of 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);
                }
            });

        });

    }

Functions Tokenize(value) and Detokenize(value) are also called in the other 2 tests, which when run, mocha exits just fine.

Any idea what's causing this?

Mocha version: 5.1.1

like image 922
Fede E. Avatar asked May 16 '18 13:05

Fede E.


People also ask

How do I exit Mocha test?

Option B: Run mocha with the --exit option. i was about to say it, the --exit option in your test and that's it! This behavior can be really helpful, and I wouldn't recommend forcing your tests to exit. Usually when mocha hangs and won't exit, there is something in your code that needs to be cleaned up.

Can Mocha rerun tests?

Retrying Mocha testsMocha provides a this. retries() function that allows you specify the number of times a failed test can be retried. For each retry, Mocha reruns the beforeEach() and afterEach() Hooks but not the before() and after() Hooks.

Do mocha tests run in order?

Mocha will run the tests in the order the describe calls execute.

What is Mocha timeout?

​ Whenever you run Mocha at the command line, it will read this file and set a timeout of 5 seconds by default. Another way which may be better depending on your situation is to set it like this in a top level describe call in your test file: describe("something", function () { this.timeout(5000); // tests...


1 Answers

I know it is a bit late to answer this, but I was facing a similar problem and saw your post.

In mocha 4.0.0, they changed the behavior of tests on finalization.From here:

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?

In your case, it seems like a call to createReadStream() was never closed.

So, you have 2 options:

Option A: Close the fs and other streams open (recommended)

Option B: Run mocha with the --exit option.

like image 129
Alex Mantaut Avatar answered Oct 16 '22 09:10

Alex Mantaut