Издевательский вызов jQuery ajax для Jest

#ajax #jestjs

#ajax #jestjs

Вопрос:

Итак, у меня есть это foo_script.js файл, который загружается и используется на product.html страница, в конце скрипт добавляет элемент DIV DOM с данными в нем. Информация для DIV поступает из функции «fetchData»:

 var fetchData = function (callback) {
  $.ajax({
     url: "foo_data.json",
     type: "GET",
     success: function success(data) {
       assignDataToDiv(data);
       callback();
     }
   });
 }
 

Я пытаюсь протестировать foo_script.js с этим index.test.js файл с использованием Jest:

 it('fetchs data and changes the div', () => {
  document.body.innerHTML = fs.readFileSync(path.resolve(__dirname, './basic.html'), 'utf8');

  spyOn($, "ajax").mockImplementation(({ success }) => success( {
  url: "https://example.api",
  success: "fooBar"
}));

  spyOn($, 'ajax').andCallFake( function (params) {
   params.success({foo: 'bar'});
 });

  require('./foo_script.js');

  const targetedDiv = document.querySelector('.ugly_class');
  expect(targetedDiv.textContent.indexOf('Ay caramba')).toBeGreaterThan(0);
});
 

все работает нормально, всегда выполняется как исходный вызов Ajax в функции fetchData(), так и «издевательский» метод ajax. Нужно ли мне изменить функцию fetchData() на обещание вместо обратного вызова? или мне нужен материал sinon? Метод spyOn() не является перехватчиком? Кстати, я новичок в Jest.

Комментарии:

1. Для jestjs нет andCallFake API? Что это? Кроме того, используете ли вы jquery ajax?

Ответ №1:

Я сделал это так:

 let proxied = window.XMLHttpRequest.prototype.open;
let open = (method, url, async, user, password) => {
  return (method, url, async, user, password) => { proxied.apply(this, arguments); };
};
const onload = jest.fn((_x) => {
  return JSON.stringify({"ip":"189.216.190.174","country_code":"MX","country_name":"Mexico"});
});
const onerror = jest.fn();
const send = jest.fn(function(){
  this.onload();
});
const setRequestHeader = jest.fn();
const xhrMockClass = function () {
  return {
    open,
    send,
    onerror,
    onload,
    setRequestHeader
  };
};

global.XMLHttpRequest = jest.fn().mockImplementation(xhrMockClass);