2

これは不可能のように思えます (そして、そうかもしれません) が、私はもっと TDD に取り込もうとしており、クロージャーで壁にぶつかり続けています。私は次のものを持っているとしましょう:

function createSomething(init) {
    function privateMethod(param) {
        return init[param];  //assuming this is more complicated, how can you test it?
    }

    function getData() {
        return init.data;
    }

    function getValue(name) {
        if (name === "privateNode" || typeof name !== "string") {
            return "permissionDenied";
        }
        return privateMethod(name);
    }

    return {
        getData : getData,
        getValue: getValue
    };
}

このコードを脇に置くことは、おそらく私の主張の最良の例ではありません。「privateMethod」が上記のものよりもはるかに複雑であると仮定すると、「privateMethod」のようなメソッドで単体テストを実行する方法はありますか、それが最善の方法ですcreateSomethingによって作成されたオブジェクトをテストすることですか? 私のアプリケーションの大部分がクロージャーの中に隠されているのでお願いします。私はこの分野についてかなり無知ですが、これは javascript と tdd の弱点のように思えます。tdd を使用しない上記のコードのフィドルはこちら: http://jsfiddle.net/QXEKd/

4

2 に答える 2

3

コンストラクターに追加のパラメーターを追加するか、初期リターンをハードコーディングすることで、クロージャーから関数 (または関数、変数などのオブジェクト) を非常に簡単に「密輸」できます。密輸された関数は、悪のようなことをしていない限り、密輸された場所からの閉鎖をまだ持っている必要があります。eval

このような関数をテスト目的でのみ取り出す場合は、悪用されないように、Web サイトに公開する前にこれらの関数にアクセスするコードをコメント アウトするか削除することをお勧めします。また、this関数を使用している場合は、関数の呼び出し方法によって変化することに注意してください。

例えば_

function createSomething(init, aaa) {
    function privateMethod(param) {
        return init[param];  //assuming this is more complicated, how can you test it?
    }

    function getData() {
        return init.data;
    }

    function getValue(name) {
        if (name === "privateNode" || typeof name !== "string") {
            return "permissionDenied";
        }
        return privateMethod(name);
    }
    // ----------------------------------
    if(aaa) return privateMethod;
    // ----------------------------------
    return {
        getData : getData,
        getValue: getValue
    };
}

var something = createSomething({
    privateNode : "allmysecrets",
    id : "1234",
    data : {
        stuff : "32t97gfhw3hg4"
    }
}, 1); // passing extra arg to get method

console.log(
    something('id'),
    something('privateNode')
) // 1234 allmysecrets
于 2013-01-04T15:47:56.607 に答える