4

次の JavaScript があるとします。

function Foo() {

    function privateStuff() {
       //do private stuff
    }

    this.publicStuff = function() {
        privateStuff();
        //do other stuff
    }

}

publicStuff()以下を実行するだけで簡単にテストできます。

var myFoo = new Foo();
myFoo.publicStuff();
//all the assertions

privateStuff()ただし、メソッドを独自のユニットとしてテストできるようにしたいと考えています。どうすればそれを自分で呼び出すことができるかわかりません。リフレクションを使用してプライベートメソッドをテストできるJava(私はJavaの方がはるかに精通しています)を使用していることは知っていますが、これらの関数を単独でテストする方法があるかどうか疑問に思っています。これを行う一般的な方法がない場合は、単体テストを実行するためにJasmineをいじり始めました。このフレームワークは、これに対する機能を提供しますか?

4

2 に答える 2

2

コードをそこに置く方法では、できません。への範囲指定されたアクセスを許可するものはありませんprivateStuff。クロージャーの概念 (JavaScript の基本) をよく読む必要があるように思えます。

f() { ... }JS でコンストラクト (およびブロックなどのいくつかの他のコンストラクト)を使用するときはtry-catch常に、暗黙的にクロージャーを作成します。あなたが行ったように関数をネストすることは完全に合法ですが、外部関数に内部関数への外部参照を与えない限り、内部関数は外部関数内からのみアクセスできます。

モジラから:

関数内に関数をネストできます。ネストされた (内部) 関数は、それを含む (外部) 関数に対してプライベートです。また、閉鎖を形成します。

クロージャは、自由変数をそれらの変数をバインドする (式を「閉じる」) 環境と一緒に持つことができる式 (通常は関数) です。

ネストされた関数はクロージャーであるため、ネストされた関数は、それを含む関数の引数と変数を「継承」できることを意味します。つまり、内側の関数には外側の関数のスコープが含まれます。

  • 内側の関数は、外側の関数のステートメントからのみアクセスできます。
  • 内部関数はクロージャを形成します: 内部関数は引数と

Mozilla のドキュメントはこれを永続させていますが、命名法はほとんどのプログラミング言語 (C++ や Java など) でポリモーフィック動作または継承に関連する非常に明確に定義された意味を持っているため、Javascript であると言うのは少し正しくありませんprivatepublicJS に関する限り、スコープが限定されていると考えて、クロージャーについて深く理解するよう努めたほうがよいでしょう。

于 2012-08-23T04:21:54.457 に答える
1

外からはできないので「プライベート」です。一時的に公開できます:

this.privateStuff = privateStuff;

または、スコープ内からテストを行いますが、それが可能であれば、テストしています...

于 2012-08-23T04:14:58.127 に答える