Próbuję użyć Jasmine do napisania niektórych specyfikacji BDD dla podstawowych żądań jQuery AJAX. Obecnie używam Jasmine w trybie samodzielnym (tj. Do końca SpecRunner.html
). Skonfigurowałem SpecRunner do ładowania jquery i innych plików .js. Jakieś pomysły, dlaczego poniższe nie działają? has_returned nie staje się prawdą, nawet pomyślał, że "yuppi!" alert pojawia się dobrze.
describe("A jQuery ajax request should be able to fetch...", function() {
it("an XML file from the filesystem", function() {
$.ajax_get_xml_request = { has_returned : false };
// initiating the AJAX request
$.ajax({ type: "GET", url: "addressbook_files/addressbookxml.xml", dataType: "xml",
success: function(xml) { alert("yuppi!"); $.ajax_get_xml_request.has_returned = true; } });
// waiting for has_returned to become true (timeout: 3s)
waitsFor(function() { $.ajax_get_xml_request.has_returned; }, "the JQuery AJAX GET to return", 3000);
// TODO: other tests might check size of XML file, whether it is valid XML
expect($.ajax_get_xml_request.has_returned).toEqual(true);
});
});
Jak sprawdzić, czy połączenie zwrotne zostało wywołane? Wszelkie wskazówki do blogów / materiałów związanych z testowaniem async jQuery z Jasmine będą bardzo mile widziane.
Spójrz na projekt jasmine-ajax: http://github.com/pivotal/jasmine-ajax .
Jest to pomocnik typu drop-in, który (zarówno w przypadku jQuery, jak i Prototype.js) zapisuje kod w warstwie XHR, dzięki czemu żądania nigdy nie wychodzą. Możesz wtedy oczekiwać wszystkiego, co chcesz w tej prośbie.
Następnie umożliwia dostarczanie odpowiedzi na urządzenia dla wszystkich przypadków, a następnie pisanie testów dla każdej żądanej odpowiedzi: sukcesu, niepowodzenia, braku autoryzacji itp.
Wyprowadza wywołania Ajax z królestwa testów asynchronicznych i zapewnia dużą elastyczność podczas testowania, jak powinny działać rzeczywiste programy obsługi odpowiedzi.
źródło
tutaj jest prosty przykładowy zestaw testów dla aplikacji js takiej jak ta
przykładowy zestaw testów, który wywoła wywołanie zwrotne na podstawie wyrażenia regularnego url
źródło
.andCallFake
, używany.and.callFake
zamiast tego. Dzięki.Kiedy określam kod Ajax w Jasmine, rozwiązuję problem, szpiegując jakąkolwiek zależną funkcję inicjującą zdalne wywołanie (np. $ .Get lub $ ajax). Następnie pobieram ustawione na nim wywołania zwrotne i dyskretnie je testuję.
Oto przykład, który niedawno podałem:
https://gist.github.com/946704
źródło
Wypróbuj jqueryspy.com Zapewnia elegancką składnię podobną do jquery do opisywania testów i umożliwia testowanie wywołań zwrotnych po zakończeniu ajax. Jest świetny do testowania integracji i można skonfigurować maksymalny czas oczekiwania Ajax w sekundach lub milesekundach.
źródło
Czuję, że muszę udzielić bardziej aktualnej odpowiedzi, ponieważ Jasmine jest teraz w wersji 2.4 i kilka funkcji zmieniło się w porównaniu z wersją 2.0.
Tak więc, aby sprawdzić, czy funkcja wywołania zwrotnego została wywołana w żądaniu AJAX, musisz utworzyć szpiega, dodać do niego funkcję callFake, a następnie użyć szpiega jako funkcji zwrotnej. Oto jak to działa:
Zrobiłem sztuczkę dla funkcji sukcesu, a także funkcji błędu, aby upewnić się, że Jasmine uruchomi specyfikację tak szybko, jak to możliwe, nawet jeśli twój AJAX zwróci błąd.
Jeśli nie określisz funkcji błędu, a AJAX zwróci błąd, będziesz musiał poczekać 5 sekund (domyślny limit czasu), aż Jasmine zgłosi błąd
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Możesz również określić swój własny limit czasu w następujący sposób:źródło