J'essayais de tester un peu la bibliothèque de notifications Apple Push quand une erreur de fuite globale s'est produite lors de la tentative d'ouverture d'une connexion APN.
Est-ce une erreur de configuration de ma part ou une erreur de node-apn ou mocha?
Je ne suis pas sûr de comprendre ce que fait CheckGlobals ... vérifie-t-il 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)
Oui, Mocha comporte un mécanisme de détection de fuite global qui alerte et échoue si votre code sous 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.
$ mocha --globals hasCert
Pour citer la documentation:
[Cette option] accepte une liste de noms de variables globales acceptés, séparés par des virgules. Par exemple, supposons que votre application expose délibérément une application nommée globale et YUI, vous souhaiterez peut-être ajouter l'application --globals, YUI.
Dans un navigateur:
mocha.setup({globals: ['hasCert']});
Vous pouvez également désactiver la détection de fuite globale en transmettant:
mocha --ignore-leaks
Dans un navigateur:
mocha.setup({ignoreLeaks: true});
J'ai rencontré ce problème également, vous avez probablement oublié une instruction var
quelque part comme je l'ai fait, ce qui signifie dans JS qu'une variable globale sera créée.
Vous devrez peut-être vous débrouiller seul, en fonction de la structure de votre application. J'espère que ce n'est pas du code tiers qui en est la cause. : P
Vous devez utiliser JSLint ou JSHint dans votre projet. Ils devraient vous aider à découvrir la source si elle se trouve n'importe où dans votre code.
Cela peut également arriver si vous oubliez new
lors d'un appel à un constructeur. Dans ce cas, this
étant l'objet global, toutes les propriétés introduites dans le constructeur seront ajoutées à l'objet global.
Ce problème ne devrait pas rester longtemps sans être détecté, mais c'est un échec de test intéressant.
Je suis tombé sur cette réponse en essayant de trouver un moyen de supprimer les fuites JSONP telles que:
Error: global leak detected: jQuery20305777117821853608_1388095882488
Squelch jQuery JSONP "fuit" via:
mocha.setup({
globals: ['jQuery*']
});
Je rencontrais cette erreur pour plusieurs fonctions comme suit:
1) test "before all" hook:
Error: global leaks detected: __timers, _document, history, addEventListener, removeEventListener, dispatchEvent, raise, __stopAllTimers, Image, _virtualConsole, run, getGlobal, dispose, top, parent, self, frames, window, _frame, $, jQuery, Handlebars, Ember, Em, MetamorphENV, Cloud, jQuery1102048038746835663915, _listeners, _length, length, document, location, close, getComputedStyle, navigator, name, innerWidth, innerHeight, outerWidth, outerHeight, pageXOffset, pageYOffset, screenX, screenY, screenLeft, screenTop, scrollX, scrollY, scrollTop, scrollLeft, alert, blur, confirm, createPopup, focus, moveBy, moveTo, open, print, Prompt, resizeBy, resizeTo, scroll, scrollBy, scrollTo, screen, mapper, mapDOMNodes, visitTree, markTreeReadonly, INDEX_SIZE_ERR, DOMSTRING_SIZE_ERR, HIERARCHY_REQUEST_ERR, WRONG_DOCUMENT_ERR, INVALID_CHARACTER_ERR, NO_DATA_ALLOWED_ERR, NO_MODIFICATION_ALLOWED_ERR, NOT_FOUND_ERR, NOT_SUPPORTED_ERR, INUSE_ATTRIBUTE_ERR, INVALID_STATE_ERR, SYNTAX_ERR, INVALID_MODIFICATION_ERR, NAMESPACE_ERR, INVALID_ACCESS_ERR, exceptionMessages, DOMException, NodeList, DOMImplementation, Node, NamedNodeMap, AttributeList, Element, DocumentFragment, Document, Attr, EventException, Event, UIEvent, MouseEvent, MutationEvent, EventTarget, languageProcessors, resourceLoader, HTMLCollection, HTMLOptionsCollection, HTMLDocument, HTMLElement, HTMLFormElement, HTMLLinkElement, HTMLMetaElement, HTMLHtmlElement, HTMLHeadElement, HTMLTitleElement, HTMLBaseElement, HTMLIsIndexElement, HTMLStyleElement, HTMLBodyElement, HTMLSelectElement, HTMLOptGroupElement, HTMLOptionElement, HTMLInputElement, HTMLTextAreaElement, HTMLButtonElement, HTMLLabelElement, HTMLFieldSetElement, HTMLLegendElement, HTMLUListElement, HTMLOListElement, HTMLDListElement, HTMLDirectoryElement, HTMLMenuElement, HTMLLIElement, HTMLCanvasElement, HTMLDivElement, HTMLParagraphElement, HTMLHeadingElement, HTMLQuoteElement, HTMLPreElement, HTMLBRElement, HTMLBaseFontElement, HTMLFontElement, HTMLHRElement, HTMLModElement, HTMLAnchorElement, HTMLImageElement, HTMLObjectElement, HTMLParamElement, HTMLAppletElement, HTMLMapElement, HTMLAreaElement, HTMLScriptElement, HTMLTableElement, HTMLTableCaptionElement, HTMLTableColElement, HTMLTableSectionElement, HTMLTableRowElement, HTMLTableCellElement, HTMLFrameSetElement, HTMLFrameElement, HTMLIFrameElement, StyleSheet, MediaList, CSSStyleSheet, CSSRule, CSSStyleRule, CSSMediaRule, CSSImportRule, CSSStyleDeclaration, StyleSheetList, VALIDATION_ERR, TYPE_MISMATCH_ERR, UserDataHandler, DOMError, DOMConfiguration, DOMStringList, XPathException, XPathExpression, XPathResult, XPathEvaluator, DocumentType, CharacterData, ProcessingInstruction, Comment, Text, NodeFilter, _parser, _parsingMode, _augmented
J'ai donc passé un caractère générique dans la fonction d'installation et cela a résolu mon problème.
mocha.setup({
globals: ['*']
});
Définissez vos variables de stub avant de l’utiliser.
var hasCert;
var hasCert = sinon.stub (instance, méthode);
J'ai ajouté "mocha.globals (['browserSync'])"; " ci-dessous pour résoudre mon problème. Le reste du code provient de https://mochajs.org/ - section: RUNNING MOCHA DANS LE NAVIGATEUR
<script>mocha.setup('bdd')</script>
<script src="basic-spec.js"></script>
<script>
mocha.checkLeaks();
mocha.globals(['jQuery']);
mocha.globals(['___browserSync___']); //<<== This line was added
mocha.run();
</script>