Я пытаюсь использовать Jasmine для написания некоторых спецификаций BDD для базовых запросов jQuery AJAX. В настоящее время я использую Jasmine в автономном режиме (т.е. через SpecRunner.html
). Я настроил SpecRunner для загрузки jquery и других файлов .js. Есть идеи, почему следующее не работает? has_returned не сбылось, даже подумал "яппи!" предупреждение отображается нормально.
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);
});
});
Как проверить, что обратный вызов был вызван? Мы будем очень благодарны за любые указатели на блоги / материалы, связанные с тестированием async jQuery с помощью Jasmine.
Посмотрите на проект jasmine-ajax: http://github.com/pivotal/jasmine-ajax .
Это вспомогательный помощник, который (для jQuery или Prototype.js) заглушает на уровне XHR, чтобы запросы никогда не уходили. Затем вы можете ожидать от запроса всего, что хотите.
Затем он позволяет вам предоставлять фиксированные ответы для всех ваших случаев, а затем писать тесты для каждого ответа, который вы хотите: успех, неудача, несанкционированный доступ и т. Д.
Он выводит вызовы Ajax из области асинхронных тестов и предоставляет вам большую гибкость для тестирования того, как должны работать ваши фактические обработчики ответов.
источник
вот простой пример набора тестов для такого приложения js
образец набора тестов, который будет вызывать обратный вызов на основе регулярного выражения url
источник
.andCallFake
, используется.and.callFake
вместо этого. Спасибо.Когда я указываю код ajax с помощью Jasmine, я решаю проблему, отслеживая любую зависимую функцию, инициирующую удаленный вызов (например, $ .get или $ ajax). Затем я извлекаю установленные для него обратные вызовы и тестирую их дискретно.
Вот пример, который я недавно привел:
https://gist.github.com/946704
источник
Попробуйте jqueryspy.com. Он предоставляет элегантный синтаксис типа jquery для описания ваших тестов и позволяет проверять обратные вызовы после завершения ajax. Он отлично подходит для интеграционного тестирования, и вы можете настроить максимальное время ожидания ajax в секундах или миллисекундах.
источник
Я чувствую, что мне нужно предоставить более свежий ответ, поскольку Jasmine теперь находится в версии 2.4, а некоторые функции были изменены по сравнению с версией 2.0.
Итак, чтобы убедиться, что функция обратного вызова была вызвана в вашем запросе AJAX, вам необходимо создать шпиона, добавить к нему функцию callFake, а затем использовать шпиона в качестве функции обратного вызова. Вот как это происходит:
Я проделал трюк для функции успеха, а также для функции ошибки, чтобы убедиться, что Jasmine выполнит спецификации как можно скорее, даже если ваш AJAX возвращает ошибку.
Если вы не укажете функцию ошибки и ваш AJAX вернет ошибку, вам придется подождать 5 секунд (интервал тайм-аута по умолчанию), пока Жасмин не выдаст ошибку
Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
. Вы также можете указать свой собственный тайм-аут следующим образом:источник