次のクラス(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
オブジェクトが汚染されている利点を有しており、このオブジェクトの別の定義と衝突する可能性は低いです。それは私がそれを望むほどまだ清潔ではありません。私は誰かがより良い解決策を提供することを望んでいます。
でたぶん唯一の、いくつかの内部変数を公開?例: 'window.exposedVars = this'(クロージャの内側)? –
あなたが投稿してから数秒後に私の提案したソリューションを追加しました。あなたが示唆していることの線に沿っていますか? – Mitch
プラグインはどのように役立ちますが、まだグローバル名前空間に何も追加していませんか?私は本当に好奇心が強い、おそらくあなたが気づいていないことをしている。私が知る限り、グローバルな名前空間に出てくるオブジェクトは少なくとも1つは常に存在する必要があります。 –