web-dev-qa-db-fra.com

Le test Mocha échoue avec l'erreur du crochet "before all"

D'après ce que j'ai compris, le cadre de test mocha lève cette erreur si une erreur survient dans la méthode before:

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


  1) "before all" hook

J'ai essayé beaucoup de choses différentes pour essayer d'attraper cette erreur, mais rien ne semble fonctionner: 

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

A partir du code commenté, vous pouvez voir que le serveur a une opération asynchrone à terminer avant que le serveur ne commence réellement à écouter. La seule chose qui semble fonctionner est d'initialiser le serveur en dehors du bloc before et d'appeler immédiatement done() dans la fonction before ou de passer une fonction qui ne prend pas de paramètre. Cependant, le problème persiste car le serveur n’est pas initialisé avant le début du test.

Ce code fonctionne terriblement lorsque je me connecte à un débogueur, je ne peux même pas inspecter pour voir ce qui ne va pas.

3
BrDaHa

Alors que je postais cette question, je suis tombé sur ce bogue , ce qui m’a amené à découvrir que je devais faire appel à this.enableTimeouts(false) au début de la fonction before, comme ceci:

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

Espérons que cela aide quelqu'un d'autre pendant quelques heures de débogage.

5
BrDaHa

Cela fait un petit moment que cela n’a pas été demandé, mais pour les futurs lecteurs, nous allons:

Vous pouvez exécuter votre test avec la commande mocha test/*.js --timeout 5000. C'est tout.

Mais si vous exécutez votre test avec la commande npm test, éditez simplement votre fichier package.json Comme ceci:

"scripts": {
    "start": "nodemon ./bin/www",
    "test": "mocha --exit --recursive --timeout 5000" // add this line
  }
0