4

こんにちはすべて私はjqueryとjavascriptに不慣れです。私はコードを書き、それをテストしたいと思っています。しかし、私はある時点で立ち往生しており、専門家の助けが必要です。

これがmyfile.jsで定義されているjqueryクラスです

$.fn.MyClass = function(arg1 ,arg2, arg3) {

  function MyFirstFunc (arg1, arg3) {
     //Do some thing 
     return arg1 + arg3;

  };

  function MySecFunc (arg2, arg3) {
     //Do some thing 

  };
MyFirstFunc(arf1 ,arg2);
}

そして、index.htmlファイルでは、このようにDOMオブジェクトでjqueryクラスを呼び出す必要があります。

$("#div1").MyClass(agr1_val, arg2_val, arg3_val);

次に、これらの関数の単体テストを実行し、テストケースを別のファイルに保存したいと思います。Qunitを選択しました。私は次のテストを書きました

test('MyFirstFunction function test', function() {
    equal(MyFirstFunc (4, 5),"9" ,"function working correctly");
});

また、index_test.htmlファイルでmyfile.jsのパスを指定しましたが、それでもQunitでエラーが発生します

file:///var/www/test.js:2:1のテスト#1で死亡:MyFirstFuncが定義されていません

誰かが私が間違っているところと、テストケースを別のファイルに保存することによって関数をテストする方法、またはそれを行うための他のより良い方法を親切に教えてもらえますか?

ありがとう

4

3 に答える 3

0

MyFirstFunc メソッドは定義されていません。これらの関数をパブリックに使用するには、MyFirstFunc と MySecFunc を戻り配列で定義する必要があります。そのように定義できます

$.fn.MyClass = function (arg1, arg2, arg3) {

    function MyFirstFunc(arg1, arg3) {
        //Do some thing 
        return arg1 + arg3;

    };

    function MySecFunc(arg2, arg3) {
        //Do some thing 

    };

    return {
        MyFirstFunc: function (arg1, arg3) {
            return MyFirstFunc(arg1, arg3);
        },
        MySecFunc: function (arg2, arg3) {
            return MySecFunc(arg2, arg3);
        }
    }
}

そして、それをテストします

test('MyFirstFunction function test', function() {
    equal($().MyClass().MyFirstFunc(4, 5),"9" ,"function working correctly");
});
于 2012-07-13T05:40:57.117 に答える
0

問題はテストケースではなく、関数定義にあります。関数を別の関数内で単純に宣言して、グローバル名前空間でアクセスすることを期待することはできません。JavaScript の関数定義の基本的な特性は、それらがスコープを提供する唯一のものであるということです。そのため、関数をオブジェクトとして使用する場合、オブジェクトの「インスタンス変数」(関数内で宣言される) はそのオブジェクト内でのみアクセス可能です。

メソッドを使用してオブジェクトを作成しようとしている場合は、それらの関数をオブジェクトのインスタンス変数に割り当てる必要があります。JavaScript のオブジェクトのインスタンス変数はthis.<variable>、コンストラクター関数 (オブジェクトの定義に使用する関数) で代入することによって定義されます。したがって、MyClass2 つのメソッドを指定するには、次のようにする必要があります。

MyClass = function(arg1, arg2, arg3) {

    this.myFirstFunc = function(arg1, arg2) {
        //Do something
    };

    this.mySecFunc = function(arg1, arg2) {
        //Do something
    };
};

var myInstance = new MyClass(x,y,z);
myInstance.myFirstFunc(a,b);

関数の引数にコンストラクターの引数と同じ名前を付けるだけでは、コンストラクターからメソッドに引数が渡されないことに注意してください。関数を定義しても具体的な引数は渡されないため、MyFirstFunc arg1 と arg2 は、外部関数の引数を MyFirstFunc に渡す命令ではなく、MyFirstFunc に渡す可能性のある引数の名前として解釈されます。

最後に、$.fnプロパティは のエイリアスjquery.prototypeであるため$.fn.MyClass = function...、新しいプロパティを JQuery オブジェクトに割り当てて、基本的にライブラリに独自のアドオンをパッチします。ユースケースはわかりませんが、これはおそらく一般的に関数を定義する方法ではありません。

于 2012-07-13T05:41:28.860 に答える
0

まず、jquery オブジェクトで不適切なメソッドを宣言しています。

それ以外の:

function MyFirstFunc (arg1, arg3) {

以下を使用する必要があります。this.MyFirstFunc = function(arg1, arg3) {

また、次の例のように、jQuery オブジェクトを使用してメソッドを呼び出す必要があります。

equal($("#div1").MyClass(1, 2, 3).MyFirstFunc(4, 5),"9" ,"function working correctly");

以下は実際に動作する Qunit テストの例です。

$.fn.MyClass = function(arg1 ,arg2, arg3) {

    this.MyFirstFunc = function(arg1, arg3) {
        //Do some thing 
        return arg1 + arg3;

    };

    this.MySecFunc = function(arg2, arg3) {
        //Do some thing 
    };

  return this.MyFirstFunc(arg1, arg3);
};

$(function() {
    $("#div1").MyClass(1, 2, 3);
});

test('MyClass function test', function() {
    equal($("#div1").MyClass (1,2,3),"4" ,"function working correctly");
});
于 2012-07-13T05:39:17.990 に答える