39 votes

erreurs de fuite globale dans mocha

J'essayais de tester l'unité bibliothèque de notification push d'apple quand j'ai eu une erreur de fuite globale en essayant d'ouvrir une connexion APN.

Est-ce une erreur de configuration de ma part ou une erreur dans node-apn ou mocha ?

Je ne suis pas sûr de comprendre ce que fait checkGlobals... Est-ce qu'il vérifie simplement si une variable globale est définie ?

0) Feed "before all" hook:
   Error: global leak detected: hasCert
     at Runner.checkGlobals (/usr/lib/node_modules/mocha/lib/runner.js:96:21)
     at Runner.<anonymous> (/usr/lib/node_modules/mocha/lib/runner.js:41:44)
     at Runner.emit (events.js:64:17)
     at /usr/lib/node_modules/mocha/lib/runner.js:159:12
     at Hook.run (/usr/lib/node_modules/mocha/lib/runnable.js:114:5)
     at next (/usr/lib/node_modules/mocha/lib/runner.js:157:10)
     at Array.<anonymous> (/usr/lib/node_modules/mocha/lib/runner.js:165:5)
     at EventEmitter._tickCallback (node.js:126:26)

51voto

ento Points 1935

Oui, Mocha dispose d'un mécanisme de détection des fuites globales qui alerte et échoue si votre code testé introduit des variables globales.

Si hasCert est déclaré dans une bibliothèque et que vous n'avez aucun contrôle sur sa création, vous pouvez dire à Mocha de l'ignorer.

Sur le ligne de commande ,

$ mocha --globals hasCert

Pour citer la documentation :

Cette option] accepte une liste délimitée par des virgules de noms de variables globales acceptées. Par exemple, si votre application expose délibérément une variable globale nommée app et YUI, vous pouvez ajouter --globals app,YUI.

Dans un navigateur :

mocha.setup({globals: ['hasCert']});

3 votes

Je ne sais pas pourquoi, mais mocha.setup({globals: ['hasCert']}); ne m'a pas fait du bien. Jimchao's mocha.setup({ignoreLeaks: true}); Cette suggestion m'a quand même permis d'y arriver.

1 votes

Vous devrez remplacer 'hasCert' par la variable avec laquelle mocha détecte une fuite.

0 votes

Cette erreur s'applique également si une variable a été mal orthographiée et est utilisée dans une affectation. Plutôt utile, même si j'étais perplexe au début :)

24voto

Jimchao Points 1005

Vous pouvez également désactiver la détection globale des fuites en passant :

mocha --ignore-leaks

Dans un navigateur :

mocha.setup({ignoreLeaks: true});

0 votes

Où dois-je placer cette mocha.setup({ignoreLeaks: true}); ? Cela n'a pas l'air de fonctionner si je le colle dans le fichier mocha.opts et ni l'un ni l'autre --ignore-leaks .

12voto

Dominic Barnes Points 13815

J'ai rencontré ce problème également, vous avez probablement oublié une var quelque part comme je l'ai fait, ce qui en JS signifie qu'une variable globale sera créée.

Vous devrez peut-être le rechercher vous-même en fonction de la façon dont vous avez structuré votre application, en espérant que ce n'est pas un bout de code tiers qui est à l'origine de ce problème. :P

Vous devez utiliser JSLint ou JSHint à travers votre projet, ils devraient aider à découvrir la source si elle se trouve quelque part dans votre code.

7voto

Cela peut aussi arriver si vous oubliez new dans un appel à un constructeur. Dans ce cas, this est l'objet global, donc toutes les propriétés introduites dans le constructeur seront ajoutées à l'objet global.

Ce problème ne devrait pas rester longtemps non détecté, mais c'est un échec de test intéressant.

0 votes

Pour moi, elle a été déclenchée par un new appel au constructeur sans arguments (le ctor attendait 3 args).

4voto

muffs Points 527

Je suis tombé sur cette réponse alors que j'essayais de comprendre comment étouffer les fuites JSONP, comme par exemple :

Error: global leak detected: jQuery20305777117821853608_1388095882488

Éliminez les "fuites" JSONP de jQuery :

mocha.setup({
  globals: ['jQuery*']
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X