3

私は次のようにモジュールパターンを作成しました:

var A = (function(x) {
   var methodA = function() { ... }
   var methodB = function() { ... }
   var methodC = function() { ... }
   ...
   ...
   return {
      methA: methodA,
      methB: methodB
   }
})(window)

このコードでは、methAのみを呼び出しますmethB()Aこれは、私が欲しいものであり、好きなものです。今私が抱えている問題-少なくとも最小限の労力で、痛みを伴わずに単体テストを行いたいと思います。


最初は簡単に戻ることthisができますが、間違っていました。オブジェクトを返しwindowます(誰かが理由を説明できますか?)。

2番目-オンラインのどこかで解決策を見つけました-このメソッドをリターンブロック内に含めるには:

__exec: function() {
    var re = /(\(\))$/,
        args = [].slice.call(arguments),
        name = args.shift(),
        is_method = re.test(name),
        name = name.replace(re, ''),
        target = eval(name);
    return is_method ? target.apply(this, args) : target;
}

このメソッドでは、次のようなメソッドを呼び出します。A.__exec('methA', arguments); これはほとんど私が望むものですが、かなり醜いです。私は、プライベートメソッドを明らかにするためだけに、本番コードで決して使用されないA.test.methA()場所を好みます。test


編集 私は人々が私に小さな部品の代わりに大きなものをテストするように言っているのを見ます。説明させてください。私の意見では、APIは、一連の内部関数ではなく、必要なメソッドのみを明らかにする必要があります。サイズが小さく機能が制限されているため、内部はテストがはるかに簡単で、全体をテストして、どの部分が間違っているかを推測できます。

私は間違っているかもしれませんが、オブジェクト自体からすべてのメソッドへの参照を返す方法を確認したいと思います:)。

4

2 に答える 2

2

最初の質問への回答(これを返しますが、必要なオブジェクトではなくウィンドウを返します):thisこの関数がオブジェクトのメソッドでない限り、関数内のjavascriptはグローバルオブジェクトを返します。

次の例を検討してください。

1)thisグローバル オブジェクト () を指します。

function(){
   return this;
}

2)thisオブジェクトを指します:

var obj = {
    value: "foo",
    getThisObject: function(){
        return this;
    }
}

オブジェクトを返す関数があるため、あなたのケースは例#1です。この関数は、オブジェクトのメソッドではありません。

2 番目の質問に対する最良の答えは、パブリック メソッドのみをテストすることですが、それがあなたにとって非常に重要な場合は、次に提案できます。

サーバー側でモジュールを動的に作成します。

使い方:

  • 必要な機能用に個別のスクリプトを作成します。
  • これらの個別のスクリプトのテストを作成します。
  • 必要に応じてスクリプトを 1 つに結合するメソッドを作成します。
  • スクリプトをロードするには、スクリプトを結合する方法を参照してください。

うまくいけば、それはあなたの問題を解決することができます. 幸運を!

于 2013-06-07T06:59:52.623 に答える
0

名前空間を使用して、モジュールとパブリック メソッドを js エンジンに追加してみませんか。このような:

window['MyApp']['MODULE1'] = { "METHOD1" : {}, "METHOD2" : {}}; 

このSample モジュールのようなモジュールを JavaScript で作成します

そして、次のようにテストします: JavaScript での単純な単体テスト

一般に、eval() の使用はお勧めできません。

于 2013-03-18T16:39:23.740 に答える