6

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

しかし、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 

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

テストしたい生成されたJavascriptは次のとおりです。

(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ファイルは次のとおりです。

test('getGoodNamePart()', function() {
  equals(getGoodNamePart("\"Kev Burke\" <kev@inburke.com>"), "Kev Burke", "\"name\" <email> works");
  equals(getGoodNamePart("", "", "empty string works"));
  equals(getGoodNamePart("kev@inburke.com", "kev@inburke.com", "raw email works"));
  return equals(getGoodNamePart("<kev@inburke.com>", "kev@inburke.com", "email inside carets -> carets get stripped"));
});

ありがとう、ケビン

4

2 に答える 2

6

getGoodNamePartつまり、グローバル名前空間を汚染することなくテストしたいと言っています。しかし、CoffeeScript は各ファイルを自動的にモジュール化します (正当な理由があります —ここでの私の回答を参照してください)。つまり、複数のファイルにまたがる関数にアクセスする唯一の方法は、関数を何らかのグローバル オブジェクトにアタッチすることです。(ここではブラウザについて話していると仮定しています。Node.js などの CommonJS 環境ではなく、exports.)

これにより、次の 3 つのオプションが提供されます。

  1. に添付getGoodNamePartwindowます。必要な変更は接頭辞 (または単に ) だけなので、これは最も簡単ですgetGoodNamePartwindow.@もちろんこれは名前空間の汚染を最大化します。
  2. またはgetGoodNamePartに既に接続されている別のものに接続します。windowglobal
  3. テストを同じファイル内に移動しますgetGoodNamePart(JS の世界では珍しい慣行ですが、グローバル名前空間をそのままにして、コードとテストの間を簡単に移動できるため、検討する価値があります)。

getGoodNamePart#2 を使用して、純粋にテスト用に関数をエクスポートするとします。それらを「テスト ターゲット」と呼びます。テスト ターゲットを含む各ファイルの先頭に、次を追加します。

window.testTargets ?= {}

を定義するときは、次のようgetGoodNamePartに記述します。

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

次に、QUnit テスト スイートの上部に次のように記述します。

{getGoodNamePart} = testTargets

関数を取得します。

于 2011-06-25T19:37:35.533 に答える