2013-06-29 5 views
0

У меня есть функция, которая загружает HTML-код на страницу, а затем присоединяет элементы DOM и прослушиватели событий и устанавливает переменную loaded в true (для целей тестирования). Все это завернуто в родительскую функцию, поэтому я могу передать аргументы и управлять пространством имен, с функциями, которые мне нужно проверить, выставленными в возвращаемом объекте.jasmine asynchronous testing waitsFor/run timeout

((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() просто возвращает false до тех пор, пока запрос AJAX не будет успешным. Тогда в моем файле спецификации у меня есть:

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) 

Я предполагаю, что это инициализация PanelLoader, подтверждающий, что нет никакого «панели» DOM элемента, то waitsFor должен блокироваться до `panelHasBeenLoaded() возвращает истинное, время через 3 секунды (должно быть достаточно времени, отключение localhost), тогда он запускает тест, ожидая, что элемент DOM теперь будет там.

Проблема, с которой я сталкиваюсь, заключается в том, что она всегда выберет время, в результате чего второй тест ожидания завершится неудачей. Это все работает, когда я тестирую в браузере, так почему же мой модульный тест не работает?

Я использую жасмин и фантомный JS для тестирования через бегун из-за жасмина.

Благодаря

ответ

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'); 

означает, что второй runs() не исполняется до waitsFor(), но console.log(), который не вложен в runs(), выполняется без ожидания. Я не вижу runs() до waitsFor() в вашем коде, поэтому waitsFor(), вероятно, ничего не делает.