2010-12-03 19 views
1

私は非常に軽量なシステムで作業用にビルドしているjavascriptフレームワークをテストしています。javascriptのイベント処理

私はテストサイクルを壊すことなくフィードバックを報告するためにtry/catch内でテストしている関数を呼び出すラッパーとして機能するテスト関数を作成しました。問題は、意図的にエラーを作成すると、キャッチが呼び出されないということです。事前に

私のコード....

/// <summary> 
    ///  Acts as a wrapper to allow us to perform and report the result 
    ///  of each individual 
    ///  test without blocking further tests. 
    /// </summary> 
    /// <param name="selector" type="String"> 
    ///  The id jQuery selector e.g #versionTests to repot feedback to. 
    /// </param> 
    /// <param name="testFunction" type="Function"> 
    ///  The test function to call. 
    /// </param> 
    test: function (selector, testFunction) { 

     try { 
      // now we are calling our own callback function 
      if (typeof testFunction === 'function') { 

       testFunction.call(); 
      } 
     } catch (e) { 

     jQuery(selector).addClass("error").append("<p>" + e.description + "</p>"); 

     } 

    } 

おかげで....

EDIT ...追加され、明確にするためのコードと呼ばれます。

私が呼び出していたテスト機能は、これを呼び出す

testEqualizeHeight: function() { 

     PeachUI("div.heightTest").equalizeHeight(); 
    } 

.......(this.selectorがjQuerysセレクタを反映するプロパティです。)....基本的にはこれを呼び出すにある $selector.height(tallest);

equalizeHeight: function() { 
    /// <summary> 
    ///  Equalizes the height of the specified element(s). 
    /// </summary> 

    var $tallest = 0, $selector = this.selector; 

    $selector.each(function() { 

     var $height = jQuery(this).height(); 

     if ($height > $tallest) { 

      $tallest = $height; 
     } 
    }); 

    // ie6 height is the same as min-height for other browsers. 
    if (PeachUI.browser.ie6) { 

     $selector.height(tallest); 

    } else { 

     $selector.css("min-height", $tallest); 
    } 
} 
+0

エラーを作成するコードを投稿できますか? – cambraca

答えて

2

あなたsource codeあなたがこの驚くべき事(最後の行)を行うように私には登場して見て:あなたはPeachTest.testからPeachTest.testNumericへの参照を渡すが、あなたここで

PeachTest.test("#versionTests", PeachTest.testVersion()); 
PeachTest.test("#browserTests", PeachTest.testBrowser()); 
PeachTest.test("#isNumericTests", PeachTest.testNumeric); 
PeachTest.test("#heightTests", PeachTest.testEqualizeHeight()); 

を他の3つのテスト関数を呼び出して、それらの関数が返す値をPeachTest.testに渡します。

これらのパラメータの後ろにある関数呼び出し演算子(())を削除すると、テスト関数が期待通りに機能します。

+0

私はそんなに馬鹿だとは信じられません!どうもありがとうございます! :) –

+0

@James - Hehe、よろしいですか? –

0

どちらかtestFunctionに欠け'$'は(それが条件に包まれている)と呼ばれる取得されていない、またはエラーを追加するためのコードが間違っています注意してください。

私はテスト実行をトレースし、それがあなたが思っているパスをたどっていることを確認するためにデバッガを使います。またはconsole.logs()

+0

@ hvgotcodes:エラーを取り除いたときに実行されるので、testfunctionが確実に呼び出されています。 –

2

実際には.call()を呼び出す必要はありません。あなただけ使用することができます。

testFunction(); 

明示的に実行コンテキストセットアップする場合は、あなたが.call(context, param1, param2, ..)

どのようにして、「故意」エラーを作成してくださいを使用することができますか?ここで言及する最後の事はexception objectが財産descriptionが、messageを所有していないこと、である

throw new Error('Foo Bar'); 

ようtestFunction以内に例外をスローするようにしてください。

例:http://www.jsfiddle.net/RUeEm/

+0

@ jAndy:descriptionプロパティにw3schoolsを付けることができます。 http://www.w3schools.com/js/js_try_catch.asp私はそれがMSの唯一のものであることを認識しませんでした。 –

+0

@James:W3Schoolsは**間違い、悪いコーディング慣行、ひどい例などの**完全なものです.W3SchoolsはW3Cに全く属していないことに注意してください。より良いガイドについては、[MDC](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Error#Properties_2)を参照してください。また、 'description'はプロプライエタリなプロパティです。 –

+0

@JamesSouth:誰にも責任がありません。私はちょうどそれを指摘したかった:) – jAndy