глобальные ошибки утечки в мокко - PullRequest
36 голосов
/ 02 декабря 2011

Я пытался выполнить модульное тестирование библиотеки push-уведомлений Apple , когда я получил глобальную ошибку утечки, пытаясь открыть соединение APN.

Это ошибка конфигурации с моей стороны или ошибка в node-apn или mocha?

Я не уверен, что понимаю, что делает checkGlobals ... он просто проверяет, установлена ​​ли какая-либо глобальная переменная?

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)

Ответы [ 8 ]

49 голосов
/ 06 апреля 2012

Да, в Mocha есть глобальный механизм обнаружения утечек, который предупреждает и дает сбой, если тестируемый код вводит глобальные переменные.

Если hasCert объявлено в библиотеке, и вы не можете контролировать его создание, вы можете указать Mocha игнорировать его.

В командной строке ,

$ mocha --globals hasCert

Цитировать документацию:

[Эта опция] принимает разделенный запятыми список допустимых имен глобальных переменных. Например, предположим, что ваше приложение намеренно предоставляет глобальное именованное приложение и YUI, вы можете добавить приложение --globals, YUI.

В браузере:

mocha.setup({globals: ['hasCert']});
24 голосов
/ 27 июля 2012

Вы также можете отключить обнаружение глобальной утечки, передав:

mocha --ignore-leaks

В браузере:

mocha.setup({ignoreLeaks: true});
12 голосов
/ 03 декабря 2011

Я также столкнулся с этой проблемой, вы, вероятно, забыли оператор var где-то, как я, что в JS означает, что будет создана глобальная переменная.

Возможно, вам придется выследить его самостоятельно, в зависимости от того, как вы структурировали свое приложение, и, надеюсь, это не сторонний код, который вызывает это. : P

Вы должны использовать JSLint или JSHint через ваш проект, они должны помочь раскрыть источник, если он где-то в вашем коде.

7 голосов
/ 07 октября 2012

Это также может произойти, если вы забудете new при вызове конструктора. В этом случае this является глобальным объектом, поэтому любые свойства, введенные в конструкторе, будут добавлены в глобальный объект.

Эта проблема не должна оставаться незамеченной долгое время, но это интересный провал теста.

4 голосов
/ 02 апреля 2015

Я столкнулся с этой ошибкой для многих функций следующим образом:

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

Итак, я передал шаблон в функции настройки, и это решило мою проблему.

mocha.setup({
  globals: ['*']
});
4 голосов
/ 27 декабря 2013

Я столкнулся с этим ответом, когда пытался выяснить, как устранить утечки JSONP, такие как:

Error: global leak detected: jQuery20305777117821853608_1388095882488

Squelch JQuery JSONP «просачивается» через:

mocha.setup({
  globals: ['jQuery*']
});
0 голосов
/ 22 июня 2018

Определите переменные-заглушки, прежде чем использовать их.

var hasCert;

var hasCert = sinon.stub (instance, method);

0 голосов
/ 13 марта 2018

Я добавил "mocha.globals ([' browserSync ']);"ниже, чтобы исправить мою проблему.Остальной код взят из https://mochajs.org/ - раздел: РАБОТАЯ МОЧА В БРАУЗЕРЕ

<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>
...