2012-05-04 6 views
3

저는 자바 스크립트에 익숙하지 않고 재즈민을 사용하여 오류 처리 코드를 테스트하고 있습니다.유닛 테스트 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를 트리거하지 않습니다. 이미 살펴본 몇 가지 관련 질문이 있지만 특정 브라우저 나 테스트 방법 대신 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 블록 내에서 실행되므로 하나의 테스트가 종료되면 다음 테스트를 실행할 수 있습니다 (적어도 QUn에 대해서는 True). 그리고 window.onerror는 try/catch 안에서 이미 잡힌 예외를 잡아 내지 못하기 때문에 unittest에서 이것을 테스트 할 때 실행되지 않습니다.

예외에 따라 onerror 함수를 수동으로 호출 해보십시오.

try { 
    //Code that should fail here. 
    someUndefinedFunction(); 
} catch (e) { 
    window.onerror.call(window, e.toString(), document.location.toString(), 2); 
} 

expect(globalerror.windowHandleError).toHaveBeenCalled(); 

document.location은 url 인수와 같지 않으므로 수동으로 줄 번호를 설정해야합니다. 더 좋은 방법은 e.stack에서 올바른 파일과 행 번호를 파싱하는 것입니다.

단위 테스트 내에서 이와 같은 함수를 호출 할 때 함수가 설정되었고 모든 위조 된 인수로 호출 될 때 함수가 제대로 작동하는지 테스트하는 것이 좋습니다.

3

최근 재스민과 비슷한 Buster.JS을 기반으로 한 단위 테스트를 사용하여 작은 JavaScript error handler을 개발했습니다.

The test that exercises the window.onerror

은 다음과 같습니다

"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 콜백 내에서 실제 오류가 발생합니다 done() 이것은 Buster.JS로 비동기 기능을 테스트하는 방법입니다. The same approach is available with Jasmine을 사용하여 비동기 테스트에서 done()을 사용하십시오.

+0

위대한 아이디어, 난 그냥 내 코드 int 그 브라우저를 테스트라는 오류 처리기를 얻으려면 알아낼 수없는, setTimeout() 트릭 않았다. –