2011-12-20 13 views
7

次のクラス(coffeescriptで書かれたもの)を使用するjavascriptオートコンプリートプラグインがあります:Query、Suggestion、SuggestionCollection、Autocomplete。これらのクラスのそれぞれには、ジャスミンで書かれた関連する仕様があります。グローバル名前空間を汚染することなくユニットテストのためにjavascriptオブジェクトを公開する方法

プラグインは、モジュール内で定義され、例えば:

(function(){ 
    // plugin... 
}).call(this); 

これは、グローバルな名前空間を汚染からクラスを防止するだけでなく、のようなものを持つ任意のテスト(ジャスミンと仕様、またはユニット・テストからそれらを隠しますq単位)。

グローバルな名前空間を汚染することなくテストするためのjavascriptクラスまたはオブジェクトを公開する最良の方法は何ですか?

私が思いついた解決策で答えますが、もっと標準的なものがあることを期待しています。

アップデート:私の未遂ソリューション

私は< 100 XPと初心者くさいだから、私は8時間自分の質問に答えることはできません。待つのではなく、私がここで行ったことを追加するだけです。

これらのクラスを仕様するために、私は_testというグローバルオブジェクトを作成しました。このオブジェクトはテストのためにすべてのクラスを公開しています。例えば、CoffeeScriptの中で:私のスペックインサイド

class Query 
    // ... 

class Suggestion 
    // ... 

// Use the classes 

// Expose the classes for testing 
window._test = { 
    Query: Query 
    Suggestion: Suggestion 
} 

が、その後、私はクラスを明らかにすることができます私がテストだ:

Query = window._test.Query 

describe 'Query', -> 
    // ... 

これが唯一の_testオブジェクトが汚染されている利点を有しており、このオブジェクトの別の定義と衝突する可能性は低いです。それは私がそれを望むほどまだ清潔ではありません。私は誰かがより良い解決策を提供することを望んでいます。

+0

でたぶん唯一の、いくつかの内部変数を公開?例: 'window.exposedVars = this'(クロージャの内側)? –

+0

あなたが投稿してから数秒後に私の提案したソリューションを追加しました。あなたが示唆していることの線に沿っていますか? – Mitch

+0

プラグインはどのように役立ちますが、まだグローバル名前空間に何も追加していませんか?私は本当に好奇心が強い、おそらくあなたが気づいていないことをしている。私が知る限り、グローバルな名前空間に出てくるオブジェクトは少なくとも1つは常に存在する必要があります。 –

答えて

3

CommonJSモジュールシステム(たとえば、brunchで使用されているような)が動作すると思います。

コードをモジュールに分けることができ、コードを必要とする部分はrequireでインポートできます。 "汚染された"部分は、testオブジェクトによく似た、モジュール管理コードによって管理されているモジュールマップです。

Autocomplete.coffee

class exports.Query 
// ... 

class exports.Suggestion 
// ... 

、その後Autocomplete.spec.coffee

{Query, Suggestion} = require 'app/models/Autocomplete' 

describe 'Query', -> 
+0

興味深い。私は前にこのシステムを見ていなかった。私はそれが本質的に私がしたことと非常に似ていると思います。あなたが他の人と共有したい軽量なプラグインについては、私はモジュール管理システム全体を投げたいとは思っていません。それでも、ブランチページは良い関連性の高い読み物です。 – Mitch

関連する問題