3

JavaScript ファイルに自己呼び出し関数があります。このようなもの:

com.renderer = (function(){

    render(data){

    }

    .....other functions 

    return{

        init : function(){
            $(document).ready(function(){
              jsonData = fetchFromServer();
              render(jsonData);
            });

         }
    }

})().init();

これを単体テストする方法を考えています。私はJSUnitTestDriverを使用しています。レンダー関数に外部から何らかの形でインジェクトでき​​ればそれでjsonDataいいのですが、私には無理そうです。

提案や代替案はありますか?

関数の自己呼び出しの性質を削除したくありません。そして、単体テストのために、私が良いと考える設計を変更することは本当に理にかなっていますか? (この特定のケースでは、一般的ではありません。)

注: テストの実行中はサーバーと通信できません。

4

1 に答える 1

1

問題は、シングルトンをユニットテストしようとしていることであり、シングルトンは一般的に優れた設計とは見なされません。

代わりに、次のようなものを検討します。

function createRenderer(dataFetcher) {
    function render(data) {
    }

    // other functions

    return {
        init: function () {
            $(document).ready(function () {
                jsonData = dataFetcher();
                render(jsonData);
            });
        }
    };
}

// in your production code
com.renderer = createRenderer(fetchFromServer);
com.renderer.init();

// in your unit test
var renderer = createRenderer(function () {
    return { test: "data" };
});

renderer.init();
// run your tests against renderer.

これは、依存性注入と呼ばれる手法を使用します。この手法では、JSONデータのフェッチへの依存性がレンダラーに注入され、その責任が分離されます。

于 2011-11-18T04:31:47.557 に答える