2016-05-26 4 views
1

はこれを考える:ユニットテスト可能なクロージャを作成するためのベストパターン?

var closure = (function() { 
    var some_variable; 
    var ret = {}; 

    function some_internal_function() { 
     return some_variable; 
    }; 

    function init() { 
     some_variable = document.getElementById("canvas"); 
    } 

    ret.some_internal_function = some_internal_function; 

    return ret; 
}()); 

私はユニットテストの際にモックオブジェクトにsome_variableにできるようにしたいと思います。しかし、これは不可能と思われる。 There used to be a work around with eval()しかし、それはもはや可能ではないようです。

init()私が望む模擬をするために関数を乗っ取らなければならないと思っていますが、それは基本的には振る舞いを指示する別の関数の実行に依存しているので、単体テストの哲学に反するようです私がテストしたいもののうちの一つ!

私は関数実行中にオプションのコンテキストで渡すコードを見てきましたが、これは内部変数のテスト/取得に関係していると想定しています。

私は、新しいノードのプロセスをフォークnode -e closure.toString()var some_variable = {}; //the mock objectに文字列を変更し、値(console.log(closure.some_internal_function()))を返すメソッドを追加し、パイプ戻って結果を私のメインプロセスにとqunitでassert()の操作を行う可能性があるとします。しかし、より良い方法が必要なときは英雄になろうとしているようです(this way> <よりも簡単なものがあれば)。

良い方法がありますか?このようなことをテストするための最良のパターンは何ですか?

+0

上記の 'closure'変数に代入するのはクロージャではなく、オブジェクトです。そのプロパティの1つ*はクロージャ( 'some_internal_function')ですが、オブジェクトはそうではありません。しかし、興味深い質問。 –

+1

@ T.J.Crowder、まあまあ、ちょうど疲れました。 XD – mathFromtheGroundUp

答えて

1

より良い方法は、匿名のモジュールパターンを使用しないことです。次のことを考えてみましょう:

var closure = aNameThatConveysWhatYourThingIs(document.getElementById("canvas")); 

function aNameThatConveysWhatYourThingIs(some_variable) { 
    var ret = {}; 

    function some_internal_function() { 
     return some_variable; 
    }; 

    ret.some_internal_function = some_internal_function; 

    return ret; 
} 

これは、あなたが苦労しているものである、dependency injectionを達成するためにはスタントを必要としません。

あなたのテストでは、操作されている状態にアクセスしてアサーションを行うために、黙った依存関係を持つ関数を単に呼び出すことができます。


匿名モジュールパターンの使い方:

  • ではなく、彼らのために尋ねるの依存関係を取得します。
  • モジュール内のコードを親スコープで強く結合します。

ことで結果として得られる:コードによって操作されている状態を制御するのは難しい

  • 、あなただけではなく、このためのサポートを持つことをやるために巧妙でなければなりません。
  • 書かれた文脈からコードを分離するのは難しいです。

これらは、匿名モジュールパターンに固有のテスト容易性を害する特性です。それを使用することは、あなたのコードからの期待と一致していないようです。

+0

私は[The Module Pattern](http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html)、つまりフォームを使用しようとしています。編集は両方を行うように見え、私が言及したパターンに従います。 – mathFromtheGroundUp

+0

私の答えはあなたの目標に合っていないので、このパターンを無視するように指定しています。フォークを使ってスープを食べるのが一番クールかもしれませんが、あなたが私に尋ねるなら、スプーンが行く方法です。私はそれを伝える答えを明確にします。 –

+0

あなたは絶対に正しいです。私はJS(主にPythonのバックグラウンド)に少し慣れているので、Way Things Are Done(TM)の扱いを得ようとしています。これが正しく聞こえるかどうかを教えてください。モジュールパターンを__without__する(テストするのは苦痛だから)、デプロイメント時にモジュールパターンでラップしますか?同様のことを私は見たことがありますが、明示的に概説する開発のベストプラクティスに関する記事は見ていません。しかし、どこにでも配備されたコードのモジュールパターンを見てきました。少なくとも配備のために実装するのに良いパターンだという印象を与えてくれました。 – mathFromtheGroundUp

1

ただ、もう少し完全なものにする:

http://superherojs.com/

関連する問題