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