Jasmine 2.0, как обрабатывать запросы ajax

Я хочу протестировать функцию, которая включает запрос ajax. Тест должен дождаться успешного/неудачного выполнения ajax-запроса. Запуск теста не работает, потому что он не ждет прямо сейчас.

это я хочу проверить:

this.requestServerBoxId = function()
{
    //ajax-request
    $.ajax({
        url: this.host_addr+"/?getid="+this.name,
        type: 'POST',
        data: {_data:this._data},
        success: function(data) {
            return IdSuccess(data);
        },
        error: function(data){
            return false;
        }
    });
}
function IdSuccess(data){
   if(typeof data != undefined)
       return true;
    return false;
}

Это мой тест:

it("should call a function after ajax-success", function(){
    expect(this.Process.requestServerBoxId()).toBe(true);
});

Я попробовал шпионов, но я думаю, что использую их неправильно:

 spyOn($, 'ajax' ).and.returnValue(123);

Я надеялся, что этот шпион будет возвращать 123 каждый раз, когда делается запрос ajax. Но это не работает.


person marcel    schedule 07.03.2014    source источник


Ответы (2)


В Jasmine 2.0 появился совершенно новый API для тестирования ajax (и практически всего остального).

Вместо:

spyOn($, 'ajax').and.returnValue(123);

Настройте методы beforeEach и afterEach перед тестом it:

beforeEach(function() {
  jasmine.Ajax.install();
  jasmine.Ajax.stubRequest('YOUR_URL_HERE').andReturn({
    responseText: 'YOUR_RAW_STUBBED_DATA_HERE'
  });
});

afterEach(function() {
  jasmine.Ajax.uninstall();
});

it('My Ajax Test', function() {
  // . . . code that makes an ajax request . . .
});

Затем тест it выполнит свой запрос ajax, как и ожидалось.

Обратите внимание, что это делает ваш вызов ajax по существу синхронным, но немедленным.

person Donald Taylor    schedule 14.03.2014
comment
привет, я дошел до этого момента, но потом у меня возникла проблема с данными json, может быть, вы знаете об этой проблеме? вот мой оригинальный вопрос (stackoverflow.com/questions/28428748 /) - person eldi; 11.02.2015
comment
Интересно отметить, что в jasmine 2.5 нет метода с именем jasmine.ajax. Это часть плагина под названием jasmine-ajax. Я пошел искать его... - person Simon; 17.11.2016

Возможно, вы захотите взглянуть на что-то вроде https://github.com/pivotal/jasmine-ajax. . Это позволит вам заглушить запрос ajax и указать, что вы хотите, чтобы он возвращал, ведя себя как обычный запрос ajax.

Проблема с spyOn в этом случае заключается в том, что метод jQuery $.ajax на самом деле возвращает что-то вроде промиса, которому вы затем должны отправить правильный результат, поэтому простой .and.returnValue не будет делать правильную вещь.

person Gregg    schedule 07.03.2014