Я думаю, вы можете сделать два типа тестов:
- Модульные тесты, которые подделывают запрос AJAX (с использованием шпионов Jasmine), позволяя вам протестировать весь ваш код, который запускает непосредственно перед запросом AJAX и сразу после . Вы даже можете использовать Жасмин, чтобы подделать ответ от сервера. Эти тесты были бы быстрее - и им не нужно было бы обрабатывать асинхронное поведение - так как никакого реального AJAX не происходит.
- Интеграционные тесты, которые выполняют реальные запросы AJAX. Они должны быть асинхронными.
Жасмин может помочь вам выполнить оба вида тестов.
Вот пример того, как вы можете подделать AJAX-запрос, а затем написать модульный тест, чтобы убедиться, что поддельный AJAX-запрос шел по правильному URL:
it("should make an AJAX request to the correct URL", function() {
spyOn($, "ajax");
getProduct(123);
expect($.ajax.mostRecentCall.args[0]["url"]).toEqual("/products/123");
});
function getProduct(id) {
$.ajax({
type: "GET",
url: "/products/" + id,
contentType: "application/json; charset=utf-8",
dataType: "json"
});
}
Для Жасмин 2.0 используйте вместо:
expect($.ajax.calls.mostRecent().args[0]["url"]).toEqual("/products/123");
как отмечено в этом ответе
Вот аналогичный модульный тест, который проверяет, что ваш обратный вызов был выполнен после успешного выполнения AJAX-запроса:
it("should execute the callback function on success", function () {
spyOn($, "ajax").andCallFake(function(options) {
options.success();
});
var callback = jasmine.createSpy();
getProduct(123, callback);
expect(callback).toHaveBeenCalled();
});
function getProduct(id, callback) {
$.ajax({
type: "GET",
url: "/products/" + id,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: callback
});
}
Для Жасмин 2.0 используйте вместо:
spyOn($, "ajax").and.callFake(function(options) {
как отмечено в этом ответе
Наконец, в другом месте вы намекнули, что вы можете захотеть написать интеграционные тесты, которые делают реальные запросы AJAX - для целей интеграции. Это можно сделать с помощью асинхронных функций Жасмин: waits (), waitsFor () и run ():
it("should make a real AJAX request", function () {
var callback = jasmine.createSpy();
getProduct(123, callback);
waitsFor(function() {
return callback.callCount > 0;
});
runs(function() {
expect(callback).toHaveBeenCalled();
});
});
function getProduct(id, callback) {
$.ajax({
type: "GET",
url: "data.json",
contentType: "application/json; charset=utf-8"
dataType: "json",
success: callback
});
}