1

テストする必要のあるJSクラスがあります。

SomeClass = function {  
    // some stuff that uses initRequest    
    this.initRequest = function() {  
        if (window.XMLHttpRequest) {  
            return new XMLHttpRequest();  
        } else if (window.ActiveXObject) {  
            return new ActiveXObject("Microsoft.XMLHTTP");  
        }   
     }  
}

テスト目的でメソッドinitRequestをオーバーライドしたい。私はそのようなことをしようとしました

var request = new MockXmlHttpRequest();  
var instance = new SomeClass();
instance.initRequest = function() {
    return request;
};
// some calls of the SomeClass methods that use initRequest
// some test code with assertions for the request

それでもinitRequestメソッドを呼び出すと、実際には元のコードが呼び出されますが、渡そうとした関数は呼び出されませんinstance.initRequest

何が問題なのですか?

4

5 に答える 5

0

最初の例では、initRequestは各呼び出しの後に新しいオブジェクトを返します。2番目の例では、initRequestへのすべての呼び出しは、唯一の(モック)オブジェクトへの参照を返します。

提供するコード例では、リクエストオブジェクトは変更されません。instance.initRequest simpleは、リクエストへの参照を返します。なぜそれが変わったと期待するのですか?

于 2009-11-18T14:40:13.700 に答える
0

YUIの拡張機能を確認してください。これにより、これらすべてが本当にクリーンになります。さらに、本当に必要な場合は、スーパークラスのメソッドにアクセスできます。それらの拡張オブジェクトもあなたにとって興味深いかもしれません。

ここにリンクがありますhttp://developer.yahoo.com/yui/examples/yahoo/yahoo_extend.html

于 2009-11-18T12:56:24.080 に答える
0
SomeClass.prototype.initRequest = function() 
  {  
  return request;
  }  
于 2013-03-07T02:25:47.427 に答える
0

あなたの英語のせいであなたの質問を理解するのに少し苦労していますが、とにかく答えようとします (間違った質問に答えたら、私に知らせてください)。

あなたがやりたいことは次のとおりだと思います:

SomeClass = function {  
    // some stuff that uses initRequest    
    this.initRequest = function() {  
        return request;
     }  
}

つまり、元の SomeClass オブジェクトを新しい関数で上書きする必要があります。そうしない限り、新しい SomeClass オブジェクトはテスト メソッドを使用せず、元のメソッドを使用するだけです。

ただし、クラス全体ではなく、特定のオブジェクトに対してのみそのメソッドをオーバーライドする場合は、そこにあるものが機能するはずです。もしそうなら、それについて何がうまくいかないのかを明確にしていただけますか?

于 2009-11-19T00:57:38.260 に答える
-1

まず第一に、このコード サンプルは JavaScript での OOP の最良の方法ではありませんprototype。代わりに使用してください。別の発言、あなたのサンプルは私のブラウザでエラーをスローします(関数の無効な宣言SomeClass、おそらく入力ミスだけです)。そして最後に、instance.initRequest実際に (私は Google Chrome で実行しました) オブジェクトを返します

于 2011-11-01T23:11:46.110 に答える