Жасмин тестирует .load() для получения вызываемого URL

У меня есть функция, которая загружает шаблон, и я хочу проверить, что вызывается правильный URL-адрес.

Поскольку я не могу найти никакой информации, кроме слежки за вызовами ajax, я предполагаю, что то же самое для вызовов .load(). Я использую Жасмин 2.4.1

Функция

function templateLoader() {
    var templateURL = '/path/to/template.html';
    $('#myElement').load(templateURL, function(response, status, xhr) {
        if (status === "error") {
            common.templateError(templateURL, xhr);
        } else {
            ns.successFunction();
        }
    });
}

Жасминовый тест

var templateURL = '/path/to/template.html';
spyOn($('#myElement'), "load");
templateLoader(); // call the function
expect($('#myElement').load.calls.mostRecent().args[0]["url"]).toEqual(templateURL);

Когда я запускаю этот тест, я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство «mostRecent» неопределенного

Есть ли другой способ сделать это? Я также хочу проверить, вызывается ли функция успеха, но пока я не могу проверить правильность URL-адреса, я не могу этого сделать.


person StudioTime    schedule 20.09.2016    source источник


Ответы (1)


Несколько замечаний:

  • Ваша загрузка - это функция ajax, поэтому вам нужно будет spyOn $.ajax, а не $(#myElement).load
  • Вы не можете одновременно проверить URL-адрес вызова и SuccessCallBack, не издеваясь над самой функцией ajax. Это связано с тем, что ваш successCallback выполняется только после того, как вы получите ответ от сервера, в то время как ваш тест выполняется.
  • Следовательно, трюк состоит в том, чтобы смоделировать сам вызов ajax и вызвать fakeFunction для разрешения обещания, которое фактически разрешает значение успеха во время выполнения, т.е. синхронно, что помогает вашим ожиданиям.

Примечание. Я использовал jasmine 2.5.

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

function templateLoader(templateURL) {
  $('#myElement').load(templateURL, null, function(response, status, xhr) {
    if (status === "error") {
      common.templateError(templateURL, xhr);
    } else {
      successFunction();
    }
  });
}

successFunction = function() {
  console.log("This is a success Function");
}

describe("spec to test ajax url", function() {
  it('test load call url', function() {
    spyOn($, 'ajax').and.callThrough();
    spyOn(window, 'successFunction').and.callThrough();
    templateLoader("https://jsonplaceholder.typicode.com/posts/1");
    expect($.ajax.calls.mostRecent().args[0]["url"]).toEqual("https://jsonplaceholder.typicode.com/posts/1");    
  });

  it('test success function', function(){
    spyOn(window, 'successFunction').and.callThrough();
    spyOn($, 'ajax').and.callFake(function(e) {
      return new $.Deferred().resolve({}).promise();
    });
    templateLoader("https://jsonplaceholder.typicode.com/posts/1");
    expect($.ajax.calls.mostRecent().args[0]["url"]).toEqual("https://jsonplaceholder.typicode.com/posts/1");    
    expect(window.successFunction).toHaveBeenCalled();
    });
});
person Winter Soldier    schedule 06.12.2016