2013-06-05 12 views
12

Przeszukałem wszystko i wygląda na to, że ten błąd wynika z niewłaściwego używania asyncTest. Jednak na podstawie dokumentacji wygląda na to, że robię to poprawnie. Zgaduję, że brakuje mi gdzieś drobiazgu i potrzebuję dodatkowej pary oczu ...Błąd Qunit: asercja poza kontekstem testowym

Próbuję przetestować kod, który składa się z żądania ajax, aby uzyskać stronę, a następnie ładuje ją w lightbox . lightbox-content nie pojawia się w DOM, dopóki połączenie ajax nie zostanie zakończone i może zostać wyświetlone. Tak, mogę tylko sprawdzić to w moim wywołaniu onComplete, gdzie mam swój test, aby sprawdzić, czy załadował go poprawnie.

Oto mój kod:

asyncTest('mytest', 1, function() { 
    utils.lightbox.show('/login', { 
     onComplete: function() { 
      ok($('#lighbox-content').is(':visible'), 'Lightbox loaded the /login page.'); 
      start(); 
     } 
    }); 
}); 

pojawia się błąd:

Uncaught Error: assertion outside test context, was at HTMLDivElement.window.utils

Czy ktoś widział dokąd idę źle?

+1

Czy brakujące 't' w' lighbox-content' jest literówką podczas zamieszczania twojego pytania? –

+0

Mam ten sam komunikat o błędzie, błąd pojawia się wewnątrz 'on ('load'' wywołanie zwrotne zamiast onComplete, ale myślę, że to wszystko pod maską.) Czy próbowałeś downgrading do innej wersji QUnit? – Dan

Odpowiedz

7

Zgadzam się, że twój kod jest zgodny z dokumentacją, o ile wiem.

Aktualizacja

Mimo że dokumentacja nie pokazać, zastanawiam się, czy trzeba powiedzieć QUnit zatrzymać w pewnym momencie tak wie czekać po powrocie funkcja testu. Sądzę, że QUnit zakłada to, ponieważ jest to test asynchroniczny, ale warto spróbować.

asyncTest('mytest', 1, function() { 
    stop(); 
    ... 
}); 

Używam Sinon.JS aby uniknąć dokonywania AJAX wywołuje w pierwszej kolejności. Ma to trzy bezpośrednie korzyści:

  1. Nie zależy od serwera, aby odpowiedzieć na żądania.
  2. Potrafię podać różne wyniki dla każdego testu.
  3. Testy działają znacznie szybciej.

Szyderczy można zrobić na poziomie XMLHttpRequest lub w jQuery i jest dość łatwe. Oto przykład z jednego z moich testów:

module("geo", { 
    setup: function() { 
     this.server = sinon.fakeServer.create(); 
    }, 

    teardown: function() { 
     this.server.restore(); 
    } 
} 

test("returns detected ZIP code", function() { 
    this.server.respondWith("/geo/detect-zip-from-ip", 
          [ 200, { "Content-Type": "text/html" }, '90210' ]); 
    geo.detectZip(function (zip) { 
     assertThat(zip, is('90210')); 
    }); 
    this.server.respond(); 
}); 
+0

Dzięki David. Baw się z tym i daj mu szansę, nadal interesuje mnie kwestia Qunit – intargc

+0

To było dla mnie "stop();" dziękuję za przypomnienie. :) – joaorodr84

+0

@intargc Powodzenia w rozwiązaniu tego problemu kwestia? –

0

Znalazłem rozwiązanie dla mojej sprawy, mam nadzieję, że twój problem ma to samo źródło.

Wyjaśniając słownie:

  • Mam skomplikowaną asynchroniczne badanie
  • mam opóźnione zdarzenia, a istnieją ok i equal twierdzenia wewnątrz
  • oczywiście, to wszystko jest owinięty wewnątrz asyncTest
  • Ale kiedy test jest "ukończony" i dzwonię pod numer start(), obsługa zdarzeń pozostaje tam
  • Af ter nazywając start(), wszystkie kolejne wywołania ok wewnątrz tego asyncTest się nielegalne
  • i rzucać wyjątki
  • Zastanawiam się, co się stanie, jeśli zostanie przekroczona liczba w expect (w przykładzie jest to drugi parametr). Ten sam wyjątek?

Wyjaśniając w kodzie:

asyncTest('mytest', /*1,*/ function() { 

      function imgLoadedOrFailed (result) { 
       clearTimeout(imageTimeToLive); 
       img.off(); 
       ok(result, 'Image in carousel pane has been loaded'); 
      } 

      var imageTimeToLive = setTimeout(
        imgLoadedOrFailed.bind(this, false), 
        5000), 
       img = panes[index].find('img:first'); 

      if (img) { 
       img.on('load', imgLoadedOrFailed.bind(this, true)); 
       img.on('error', imgLoadedOrFailed.bind(this, false)); 
      } 
     }); 


     // at some point I call: start(); 

W tym przykładzie, kiedy "zakończyć" test nazywając start(), wydarzenia onload i onerror wciąż może się zdarzyć.

Powiązane problemy