2011-03-30 3 views
6

、今、このjqueryプラグインで内部関数をテストする方法は?私は、ヘルパー関数を作成しているjQueryプラグインで

(function($) { 

    var someHelperFunction = function(s, d) { 
    return s*d; 
    } 
    var someOtherHelperFunction = function(s) { 
    return s*2; 
    } 

// here goes the normal plugin code 

})(jQuery); 

のように私はユニットテスト、それのことができるようにするために、外部からsomeHelperFunctionを呼びたい、 は何とか可能ということでしょうか?

+0

外部からメソッドにアクセスすることはできないため、不可能です。 –

答えて

0

libにJavaScriptのユニットテスト、qunitを見てみヘルパーは匿名関数であるプラグイン、内側にスコープされ、そして、あなたはその中で宣言された変数にアクセスすることはできません。
テストする場合は、機能の前にvarキーワードをドロップします。これは、関数をグローバル(ウィンドウオブジェクトにアタッチする)として宣言し、ウィンドウスコープから表示できるようにします(someHelperFunctionまたはwindow.someHelperFunctionを呼び出して)。
そうでは、テストのために:

(function($) { 
    someHelperFunction = function(s, d) { 
     return s*d; 
    } 
    someOtherHelperFunction = function(s) { 
     return s*2; 
    } 
    // here goes the normal plugin code 
})(jQuery); 

テストが終わった後、再びvarキーワードを追加します。 APIを構築する -

アップデートは
私はより良いアプローチは、あなたのテスト可能な機能は、オブジェクトのグループになるだろうと思います。その後、同じ原理で、あなたは、グローバルスコープのかというAPIが見えるようにできます。

(function($, global) { 
    someHelperFunction = function(s, d) { 
     return s*d; 
    } 
    someOtherHelperFunction = function(s) { 
     return s*2; 
    } 

    var api = { 
     someHelperFunction: someHelperFunction, 
     someOtherHelperFunction: someOtherHelperFunction 
    }; 

    // decide whether you want to expose your api or not 
    if(makeGlobal) { 
     global.api = api; 
    } 
})(jQuery, this); 
+4

これを楽しんでください。 –

+3

プライベート関数をテストするためだけにグローバル変数を使用しないでください。悪い習慣を裏付けているので、これは良い答えではありません。 – drublic

2

this related questionの場合、外部インターフェイスをテストするといいでしょう。

しかし、これらのメソッドを単独でテストする必要がある場合は、内部メソッドとして、展開のコンテキスト外でそれらのメソッドの「コピー」をテストする必要があります。言い換えれば、クライアントコードにアクセスできないオブジェクトを作成し、前のプロセスで外部スクリプトと一緒にこれらのバージョンを作成します。多くの仕事のように聞こえますが、ちょっと、それは方法を隠すことのポイントですよね? (彼らが到達不能にするために。)

-3

+1

一般的なテストではありません。ローカルメソッドのテストについてです。 –

+0

おっと、申し訳ありません。自分自身に注意する:入力する前に完全にお読みください – cander

1

内部関数は、それが、彼らは多分どこか別のモジュールであるべきであることを示す良い指標だテストととして注入が必要な場合あなたのオブジェクトのパブリックインターフェイスの実装内で使用されます。それは、それを行うための「テスト可能な」方法です。

var myActualImplementationTestTheHellOutOfMe = function(s, d) { 

    return s*d; 

} 

(function($, helper) { 

    var someHelperFunction = function(s, d) { 
    return helper(s, d); 
    } 
    var someOtherHelperFunction = function(s) { 
    return s*2; 
    } 

// here goes the normal plugin code 

})(jQuery, myActualImplementationTestTheHellOutOfMe); 
1

また、JavaScript doctestsを検討してみることもできます。私が気づいている実装には、Ian Bickingのdoctest.jsと私自身のdoctestという2つの実装があります。

+0

私は各ライブラリの長所と短所を重視しようとしていますが、かなり似ています。 doctestの作者として - あなたは短期間を与えることができますか?私の場合は、パブリックAPIを持たず、HTMLのフィクスチャとドキュメントをテストする必要がある[white-space](https://github.com/dotnetCarpenter/white-space/issues/6)にユニットテストを追加することです.readyState。 – dotnetCarpenter

+0

まず、doctestを使用して使用例をテストし、最新の状態に保つようにします。 Doctestは実際にはコードではなくドキュメンテーション*をテストするためのものです。第二に、doctestは[純粋な関数](http:// en。wikipedia.org/wiki/Pure_function)、コールバックベースのコードでは使用できません。専用のテストフレームワークを使用することをお勧めします。 – davidchambers

+0

私がdoctestについて本当に好きなのは、テストのためだけに公開APIを人工的に作成する必要はないということです。私が理解する限り、クロージャの中にメソッド/関数のドキュメントを書くことができ、ユニットテストのためのアクセスを許可することができます。私が本当にテストしているのは、ブラウザ動作。 – dotnetCarpenter

関連する問題