APN接続を開こうとしたときにグローバルリークエラーが発生したとき、 Apple Push通知ライブラリ を単体テストしようとしていました。
それは私の側の設定エラーですか、それとも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)
はい。Mochaは、テスト中のコードがグローバル変数を導入した場合に警告して失敗するグローバルリーク検出メカニズムを備えています。
hasCert
がライブラリで宣言されていて、その作成を制御できない場合は、Mochaに無視するように指示できます。
コマンドライン では、
$ mocha --globals hasCert
ドキュメントを引用するには:
[このオプション]は、受け入れられるグローバル変数名のコンマ区切りリストを受け入れます。たとえば、アプリが意図的にグローバルな名前付きアプリとYUIを公開しているとすると、-globals app、YUIを追加することができます。
ブラウザで:
mocha.setup({globals: ['hasCert']});
次を渡すことで、グローバルリーク検出を無効にすることもできます。
mocha --ignore-leaks
ブラウザで:
mocha.setup({ignoreLeaks: true});
これは、コンストラクタの呼び出しでnew
を忘れた場合にも発生する可能性があります。その場合、this
はグローバルオブジェクトであるため、コンストラクターで導入されたプロパティはすべてグローバルオブジェクトに追加されます。
この問題は長期間検出されないはずですが、興味深いテストの失敗です。
次のようなJSONPリークを抑制する方法を見つけようとしたときに、この答えに遭遇しました。
Error: global leak detected: jQuery20305777117821853608_1388095882488
Squelch jQuery JSONPは次の方法で「リーク」します。
mocha.setup({
globals: ['jQuery*']
});
次のような多くの機能でこのエラーが発生しました。
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: ['*']
});
使用する前にスタブ変数を定義します。
var hasCert;
var hasCert = sinon.stub(instance、method);
「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>