Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocha test fails with error from "before all" hook

From what I understand, the mocha test framework will throw this error if some error occurs in the before method:

> $(npm bin)/mocha test/*.js


  1) "before all" hook

I've tried many different things to try and catch this error, but nothing seems to be working:

before(function(done) {
  server = require('../app')
  try {
    server.listen(process.env.PORT)
    done()
    // server.initialize()
    //   .then(() => {
    //     console.info('listening on', process.env.PORT)
    //     server.listen(process.env.PORT, done)
    //   })
    //   .catch(err => {
    //     console.log(err)
    //     done(err)
    //   })
  } catch (err) {
    console.log('outer error', err)
    done(err)
  }
})

From the commented out code, you can see that the server has an asynchronous operation I need to complete before the server actually starts listening. The only thing that seems to be working is to initialize the server outside of the before block and either call done() immediately in the before function, or pass a function that doesn't take a parameter. However this is still a problem since the server isn't initialized by the time the test starts.

Maddeningly, this code works when I connect to a debugger, so I can't even inspect to see what's wrong.

like image 833
BrDaHa Avatar asked Jan 04 '18 00:01

BrDaHa


2 Answers

As I was posting this question, I stumbled on this bug which led me to the discovery that I need to make a call to this.enableTimeouts(false) in the beginning of the before function, like so:

let server
before(function(done) {
  this.enableTimeouts(false)  <----
  server = require('../app')
  server.initialize()
    .then(() => {
      console.info('listening on', process.env.PORT)
      server.listen(process.env.PORT, done)
    })
    .catch(err => {
      console.log(err)
      done(err)
    })
})

Hopefully this helps someone else a few hours of debugging.

like image 144
BrDaHa Avatar answered Sep 17 '22 18:09

BrDaHa


It has been a little time since it was asked but for the future readers here we go:

You can run your test with mocha test/*.js --timeout 5000 command. That's it.

But if you run your test with npm test command, just edit your package.json file like that:

"scripts": {
    "start": "nodemon ./bin/www",
    "test": "mocha --exit --recursive --timeout 5000" // add this line
  }
like image 44
Mustafa Karcıoğlu Avatar answered Sep 20 '22 18:09

Mustafa Karcıoğlu