Макет window.location.reload в тестировании Jasmine

Я создал функцию window.location.reload в своем javascript.

Мне нужно смоделировать функцию перезагрузки во время тестирования в Jasmine, так как она продолжает зацикливаться.

Тест проходит хорошо, когда я запускаю grunt jenkins. Но не при тестировании в браузере (mozilla/chrome).

Вот мой фрагмент кода.

Javascript:

window.location.reload();

Жасмин Тест:

spyOn(window.location, 'reload').and.callFake(function(){});

Может ли кто-нибудь помочь мне в этом?


person Viji Pandithurai    schedule 04.12.2014    source источник
comment
window.location.reload не является записываемым свойством, поэтому браузер не позволит шпиону переопределить его. Чтобы обойти это, см. stackoverflow.com/questions/8919370/jasmine- фиктивный объект окна   -  person user2943490    schedule 05.12.2014


Ответы (5)


Спасибо, что поделились своим мнением.

Я сделал работу вокруг, как было предложено, и это было успешно.

Поскольку окно является объектом браузера и за ним нельзя следить, я просто обернул функцию в JavaScript и сослался на эту функцию в своей тестовой спецификации.

Javascript-код:

var function = windowReload(){
    window.location.reload();
}

вызовите функцию windowReload() там, где это необходимо.

Жасмин Тест:

spyOn(obj, 'windowReload').andCallFake(function(){});
person Viji Pandithurai    schedule 08.12.2014
comment
эта функция должна быть частной. а то не проверишь. бегать по кругу... - person bokkie; 20.04.2021

Вы всегда должны использовать $window вместо window.

Попробуй это:

$window = jasmine.createSpy('$window');

или просто сделайте свой собственный:

$window = {location:{reload:function(){}}};
person mkaj    schedule 07.01.2016

Я просто встречаю ту же проблему. window.location = '' вызывает цикл инфы при запуске в браузере. Простое решение — установить window.location = '#', чтобы остановить перезагрузку.

person wanana    schedule 12.09.2018

Это сработало для меня в BeforeEach с Джеймином

delete window.location;
window.location = Object.create(window);
window.location.reload = () => {};
spyOn(window.location, 'reload');

и это работало с использованием Jest

delete window.location;
window.location = Object.create(window);
window.location.reload = jest.fn();
person AngularBoy    schedule 21.01.2020

Вы всегда можете сделать:

beforeAll(() => {
  window.reload = () => console.log('Mock redirect');
});

Соответственно:

beforeAll(() => {
  window.onbeforeunload = () => console.log('Mock redirect');
  window.open = () => console.log('Mock redirect');
});
person Olezt    schedule 30.03.2017