旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

mocha の checkLeaks と globals の使い方

2013年6月20日

mocha ドキュメントの Browser support の項に、ブラウザで mocha を使う場合の例として以下の HTML が貼ってありますが、
その中に書いてある checkLeaks と globals の挙動を調べました。

<html>
<head>
  <meta charset="utf-8">
  <title>Mocha Tests</title>
  <link rel="stylesheet" href="mocha.css" />
</head>
<body>
  <div id="mocha"></div>
  <script src="jquery.js"></script>
  <script src="expect.js"></script>
  <script src="mocha.js"></script>
  <script>mocha.setup('bdd')</script>
  <script src="test.array.js"></script>
  <script src="test.object.js"></script>
  <script src="test.xhr.js"></script>
  <script>
    mocha.checkLeaks();
    mocha.globals(['jQuery']);
    mocha.run();
  </script>
</body>
</html>

今回の話は全てブラウザ内で実行した場合の話になります。

mocha.checkLeaks()

これは、「テスト前後でグローバル変数が増加していたら、エラーとみなす」オプションです。
デフォルトは false でこれを実行すると true になります。

注意として、テスト実行前後の差分で判定するので、
テスト前の、定義時に発生したものは判定してくれません。

mocha.globals()

これは、上記の checkLeaks の判定から除外する変数名を設定します。

例えば、mocha.globals([‘leak1’, ‘leak2’]); という設定をすれば、
window.leak1 と window.leak2 は判定から除外します。

特に注意すべき点として、
その時点で定義されている変数を設定してしまうと、判定が壊れます
具体的には、重複した分ひとつにつき、リーク1つを見逃してしまうようになっています。

意図したものかはわからないのですが、重複チェックをしてくれないんすよねー

詳細は、内部の globals と checkGlobals などを見てもらうとわかるので、
興味が有る方はそちらを参照してください。

という訳で、mocha ドキュメントが間違ってるという話

mocha.globals(['jQuery']); の時点で window.jQuery は存在するので、
リークをひとつ見逃すようになってしまっています。

この場合、globals は実行する必要ありませぬ。

くそう..