2012-05-04 16 views
3

私はかなり新しいjavascriptです。ジャスミンを使用してエラー処理コードのユニットテストを試みています。ユニットテストwindow.onerror with jasmine

特に、window.onerror()を置き換えるカスタムコード(windowHandleError)が呼び出され、私たちが望んでいることを行っていることを確認するいくつかのテストを作成しようとしています。

私はの線に沿って何かしようとしました:

 it("testing window.onerror", function() { 
     spyOn(globalerror, 'windowHandleError'); 
     globalerror.install(); 

     var someFunction = function() { 
      undefinedFunction(); 
     }; 
     expect(function() {someFunction();}).toThrow(); 
     expect(globalerror.windowHandleError).toHaveBeenCalled(); 
    }); 

をしかし、それはONERRORをトリガしません。私が見てきたいくつかの関連する質問がありますが、特定のブラウザや、それをテストする方法の代わりにどのように/どこでエラーを使うべきかを尋ねているようです。それらのいくつかが言ったことに基づいて How to trigger script.onerror in Internet Explorer?


window.onerror does not work
window.onerror not firing in Firefox
Capturing JavaScript error in Selenium
は、私がトリガーするONERRORを強制するデバッガでスペックのテストを実行していると思ったが、ないサイコロ。誰もがこれに対するよりよいアプローチを知っていますか?

答えて

0

ジャスミンの知識なし。

すべての単体テストはtry/catchブロック内で実行されるため、1つのテストが終了すると、次のテストを実行できます(少なくともQUnitではTrueです)。 window.onerrorはすでにtry/catch内で捕捉されている例外を捕捉しないので、unittestでこれをテストするときには実行されません。

例外に基づいてonerror関数を手動で呼び出してみてください。

document.locationはurl引数と同じではないため、行番号を手動で設定する必要があります。より良い方法はe.stackを解析して正しいファイルと行番号を調べることです。

このような関数をユニットテストの中で呼び出すときは、関数が設定されているかどうかをテストし、すべての偽の引数で呼び出されたときに正しく機能するかどうかをテストすることをお勧めします。

3

私は最近、ヤスミンに似ているBuster.JSに基づいた単体テストで小さなJavaScript error handlerを開発しました。

"error within the system": function (done) { 

    setTimeout(function() { 
     // throw some real-life exception 
     not_defined.not_defined(); 
    }, 10); 

    setTimeout(function() { 
     assert.isTrue($.post.called); 
     done(); 
    }, 100); 
    } 

それは、テストの実行を停止しないとスパイが他のsetTimeoutで100msの後に呼び出されたことを確認してから呼び出すsetTimeoutをコールバック内で実際のエラーがスローされます。

The test that exercises the window.onerrorは次のようになりますdone()これはBuster.JSで非同期機能をテストする方法です。非同期テストでdone()を使用してThe same approach is available with Jasmine

+0

グッドアイデア、私はエラーハンドラを取得する方法を把握することができませんでしたちょうど私のコードintをブラウザでテストすると、setTimeout()トリックでした。 –

関連する問題