2011-06-24 9 views
6

グローバルな名前空間を汚染するJavaScriptは一般的に悪いものとみなされます。これは、CoffeescriptがあなたのJavascriptをすべて(function() {}).call(this);ラッパーにラップする理由です。QUnit + coffeescriptの範囲

しかし、私はCoffeescriptコードのためにQUnitテストを書いています。そして、QUnitは自分の機能を見つけることができないと言っています。

1. Died on test #1: getGoodNamePart is not defined 
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run 

グローバル名前空間を汚染することなく変数をテストしたいと思います。これを行うには良い方法は何ですか?

(function() { 
getGoodNamePart = function(str) { 
    if (str.charAt(0) === '"') { 
     str.replace(/" <[^>]+>$"/g, ""); 
     str.replace(/"/g, ""); 
     return str; 
    } else if (str.charAt(0) === '<') { 
     str.replace(/<|>/g, ""); 
     return str; 
    } else { 
     return str; 
    } 
    }; 
}).call(this); 

と私のtest.jsファイルは次のとおりです:ここで

がテストに私が欲しい生成Javascriptのだそう

test('getGoodNamePart()', function() { 
    equals(getGoodNamePart("\"Kev Burke\" <[email protected]>"), "Kev Burke", "\"name\" <email> works"); 
    equals(getGoodNamePart("", "", "empty string works")); 
    equals(getGoodNamePart("[email protected]", "[email protected]", "raw email works")); 
    return equals(getGoodNamePart("<[email protected]>", "[email protected]", "email inside carets -> carets get stripped")); 
}); 

おかげで、 ケビン

+0

をモジュール化しない

$ coffee -c -b your_file

テスト目的のために、--bareフラグとコーヒーファイルをコンパイルします。 –

+0

こんにちはアーロン、私は例を追加しました。 –

答えて

6

、あなたがしたいと言いますテストgetGoodNamePartグローバル名空間を汚染することなくテストします。しかし、CoffeeScriptは自動的に各ファイルをモジュール化します(理由は - my answer hereを参照)。つまり、ファイル間で関数にアクセスする唯一の方法は、グローバルオブジェクトにそれらを付加することです。 (私はそのようなあなたがexportsを使用したいのNode.js、として、私たちはここでブラウザについて話しているということではなく、CommonJS環境を想定しています。)

はあなたに3つのオプション与えること:

  1. getGoodNamePartwindowに添付してください。必要な変更はの接頭辞がwindow.(またはちょうど@)ですが、これは名前空間の汚染を最大限にするため、これは最も簡単です。
  2. windowまたはglobalに既に添付されているものにgetGoodNamePartを添付します。
  3. あなたのテストをgetGoodNamePartと同じファイル内に移動します(JSの世界では珍しいことですが、グローバルな名前空間を変更しないでコードとテストを簡単にやりとりできるよう考慮してください)。

たとえば、純粋にテスト用に#2、エクスポート機能、getGoodNamePartなどを使いたいとします。それらを「テストターゲット」と呼んでください。テスト対象と各ファイルの先頭に、

window.testTargets ?= {} 

を追加し、getGoodNamePartを定義するときに、あなたのQUnitのテストスイートの最上部に続いて

testTargets.getGoodNamePart = getGoodNamePart = (str) -> 
    ... 

を書く

{getGoodNamePart} = testTargets 

を使用して関数を取得します。

+0

偉大な答え、感謝トレバー! –

2

私は、これはいくつかのコード例が参考になるコンパイルされたコード