Аякс не выполняется с Жасмин - PullRequest
4 голосов
/ 23 сентября 2011

У меня проблемы с выполнением ajax с помощью Jasmine BDD framework.

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

Очень простой пример, который не работает:

describe("A jQuery ajax test", function() {
  it("should make AJAX request", function () {
    expect(testAjax()).toBe(1);
  });
});

function testAjax() {
  var ret=0
  $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){ret=1;}
  });
  return ret;
}

Возвращаемое значение всегда равно 0, оно никогда не входит в функцию успеха.

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2011

Отвечая на мой вопрос. Аякс звонки в Жасмин должны быть асинхронными. Если вы не хотите изменять свой код, чтобы иметь возможность его протестировать, вы можете использовать ajaxSetup, чтобы установить значение по умолчанию для асинхронного соединения равным false

it("getsetting", function () {
  $.ajaxSetup({
    async:false
  });
  expect(getUserSetting(101,0)).toBe('30');
});
1 голос
/ 31 октября 2011

Хотя установка async в false решает проблему, это обычно не вариант в большинстве веб-приложений, потому что целая страница будет заблокирована во время вызова ajax.

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

Это должно выглядеть примерно так:

function testAjax(callback) {
  var ret=0
  $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){
        callback(ret);
    },
    error:function(){
       callback(ret);
    }
  });
}

describe("A jQuery ajax test", function() {
  it("should make AJAX request", function () {
     testAjax(function(ret){
        expect(ret).toBe(1);
     });    
  });
});
0 голосов
/ 30 декабря 2012

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

describe("A jQuery ajax test", function() {

it("should make AJAX request", function () {
var return = null;


 runs(function(){
 // hosts actual ajax call
      return = testAjax();
 });

 waitsFor(function(){
 //this method polls until the condition is true or timeout occurs,whichever occurs first
 return return.readyState==4;
 },"failure message",700//timeout in ms
 );

runs(function(){
 // 2nd runs block can be used to verify the actual change in state
 // Add other relevant expectation according to your application context.
      expect(return).toBeTruthy();

 });

});

});

function testAjax() {
// result here is a deffered object whose state can be verified in the test
var result = null;
result = $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function() { //do something on success}
    });
return ret;
}​

Обратите внимание: во время выполнения вызова AJAX вы будете ограничены Cross-origin_resource_sharing и ваш сервер должен вернутьсясогласно части ответа заголовок «Access-Control-Allow-Origin: ваш запрашивающий домен»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...