2013-06-29 2 views
0

일부 HTML을 페이지로로드 한 다음 DOM 요소와 이벤트 수신기를 연결하고 변수 loaded을 true로 설정합니다 (테스트 용). 그것은 모든 부모 함수에 싸여 있으므로 인수를 전달하고 네임 스페이스를 제어 할 수 있습니다. 리턴 객체에서 테스트 할 함수가 필요합니다.재스민 비동기 테스트 대기 시간/실행 시간 초과

((win) -> 
    win.PanelLoader = (args) -> 

     loaded = false 

     el = 
      container: $(".container") 

     showPanel = -> 
      $.get "panel.html", (data) -> 
       el.container.append(data) 
       attachDOMElements() 
       loaded = true 

     attachDOMElements = -> 
      el.panel = $(".panel") 

     panelHasBeenLoaded = -> 
      loaded 

     showPanel() 

     return {} = 
      el:  el 
      showPanel: showPanel 
) this 

panelHasBeenLoaded()는 AJAX 요청이 성공할 때까지 단순히 false를 반환합니다. 그럼 내 사양 파일에 내가 가진 :

it "should confirm when the panel is loaded", -> 
    panelLoader = PanelLoader() 
    expect(panelLoader.el.panel).toBe(undefined) 
    waitsFor (-> 
     panelLoader.panelHasBeenLoaded() 
    ), "It took too long to load in the panel", 3000 
    runs -> 
     expect(panelLoader.el.panel.length).toBeGreaterThan(0) 

내가 있다는 것을 더 '패널'DOM 요소를 확인하지, 그것은 PanelLoader를 초기화하는 것 있으리라 믿고있어`panelHasBeenLoaded()가 true, 타이밍을 반환 할 때까지, 다음 waitsFor는 차단해야 3 초 후에 (로컬 호스트에서 실행되는 충분한 시간이 있어야 함) DOM 요소가있을 것으로 기대하면서 테스트를 실행합니다.

내가 겪고있는 문제는 항상 시간 초과되어 2 차 기대 테스트가 실패하는 것입니다. 브라우저에서 테스트 할 때 모두 작동하므로 내 단위 테스트가 작동하지 않는 이유는 무엇입니까?

저는 자스민 (jasmine)과 팬텀 JS (phantom JS)를 테스트 용으로 grunt-contrib-jasmine 러너를 통해 사용하고 있습니다.

덕분에

답변

0

코드의 문제는 재스민의 waitsFor()runs() 블록에 적용한다는 것입니다. 예 ,

runs(function() { 
     asyncMethod(); 
     console.log('an asynchronous method'); 
    }, 'an asynchronous method'); 

    waitsFor(function() { 
     return x == 1; 
    }, 'x to be equal to 1', 6000); 

    console.log('this executes between two runs()'); 

    runs(function() { 
     console.log('another sequential block'); 
    }, 'another sequential block'); 

는 2 runs()waitsFor()까지 실행되지 않고, runs() 중첩되지 않는 console.log()가 대기없이 실행되는 것을 의미한다. 코드에 앞에 waitsFor()이 표시되지 않습니다. 따라서 waitsFor()은 아무 것도 수행하지 않습니다.

관련 문제