2015-08-26 2 views
0

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

Это то, что я до сих пор:

функции

Javascript:

function getAttributeInfo(selectedLayer){ 

    // Get layer attributes 
    $.ajax({ 
     type: 'get', 
     url: '/geoserver/oqplatform/ows?service=WFS&version=1.0.0&request=GetFeature&typeName='+ selectedLayer +'&outputFormat=json', 
     success: function(data) { 
      // pass the data into a global variable 
      foo = data; 
      // EDIT 
      return data; 
     } 
    }); 
} 

Тест:

it("an ajax test", function() { 

    var ajaxFunction = getAttributeInfo(SVIRLayerNames[0]); 
    // creating spied callback 
    var callback = jasmine.createSpy('callback'); 

    spyOn($, 'ajax').and.callFake(function (req) { 
     var d = $.Deferred(); 
     return d.promise(); 
    }); 

    // EDIT 
    //ajaxFunction.fetch(callback); 
    ajaxFunction(callback); 

    // everything after this does not seem to execute 
    var fakeData = callback.calls.mostRecent().args[0]; 
}); 

Если я утешаю войти переменную Foo через 5 секунд можно увидеть, что был сделан запрос ajax и данные доступны в переменной foo

+0

Какой вопрос? –

+0

Извините, если он не ясен, я хочу получить данные обратно из вызова ajax в jasmine – Bwyss

+0

Кажется, что какой-то код отсутствует. 'getAttributeInfo' ничего не возвращает, поэтому' ajaxFunction' в тесте 'undefined', то есть не имеет метода' fetch'. –

ответ

1

Af Несколько дней, изучая это, мой большой отрыв заключается в том, что Жасмин - отличный инструмент, но документация ужасная. Мне было очень сложно просто понять, что такое шпион, и когда он должен использоваться.

Моим решением было не использовать шпион вообще.

beforeAll(function(done) { 

    var mySyncFunction = function() { 

     var layerName = 'foobar'; 
     var layerRequest = getAttributeInfo(layerName); 

     layerRequest.success(function(layerResponse) { 
      // Pass data from the response into a global variable to be tests 
      // I can also check for things like the API version number. 
     }); 

     layerRequest.done(function() { 
      // Alert Jasmine that the AJAX call is done 
      done(); 
     }); 
    }; 

    mySyncFunction(); 
} 

И в функции getAttributeInfo я добавил return как раз перед $.ajax

UPDATE

... 
beforeAll(function(done) { 
    $.ajax({ 
     url: '/my/data', 
     data: {}, 
     success: function (response) { 
      foo = response 
      done(); 
     }, 
    dataType: 'html' 
    }); 
}); 

//////////////// 
// Some tests // 
//////////////// 

it("meets some requirement", function() { 
    for (var i = 0; i < foo.length; i++) { 
     var name = foo[i].fields.name; 
     expect(name).toBeDefined(); 
    } 
}); 
+0

Хороший вопрос и ответ, но вы забыли, когда я могу позвонить по вашему ожиданию – gsalgadotoledo

+0

Я включил модульный тест в обновлении ответа – Bwyss

+0

Спасибо, я получил его – gsalgadotoledo

Смежные вопросы