Някои от вашите тестове извършиха пълно презареждане на страницата - грешка при изпълнение на тестове на Jasmine

Сблъсквам се с проблем, при който, когато провеждам тестовете си на Jasmine, получавам тази грешка по-долу. Проблемът е, че изглежда се случва, когато се опитам да изпълня определено количество тестове. Изглежда не е обвързано с конкретен тест, като ако коментирам някои, тестовете минават. Ако декоментирам някои тестове, грешката се появява. Ако коментирам такива, които не са били коментирани преди, всички минават отново. (т.е. ако имам тест за червено, зелено, синьо и оранжево и той се провали, коментирам оранжево и синьо, той минава, след това декоментирам синьо и оранжево, пак се проваля, но ако коментирам червено и зелено, отново минава).

Chrome 41.0.2272 (Mac OS X 10.10.1) ГРЕШКА Някои от вашите тестове извършиха пълно презареждане на страницата! Chrome 41.0.2272 (Mac OS X 10.10.1): Изпълнено 16 от 29 (1 НЕУСПЕШНА) ГРЕШКА (0,108 секунди / 0,092 секунди)

Смаян съм какво се случва. Колкото повече тестове добавям, тогава това се превръща в проблем. Някой сблъсквал ли се е с това преди? Нямам представа какво може да го причинява, тъй като нищо в нито един от моите тестове не прави пренасочване и всички те преминават универсално на машина на друг човек.


person Siraris    schedule 30.03.2015    source източник
comment
Можете ли да добавите някои от вашите тестове към въпроса, за да добиете представа за проблема.   -  person Nicholas Murray    schedule 01.04.2015
comment
Както се посочва в съобщението за грешка, вашите тестове причиняват пълно зареждане на страницата. Трябва да се опитате да разберете защо се зарежда страницата. Тестовете трябва да навигират до ново място.   -  person Andrew Eisenberg    schedule 06.04.2015
comment
Случайно приложението ви използва ли ui-router?   -  person Manube    schedule 25.05.2015
comment
Виждам, че използвате Chrome. Същото нещо случва ли се във Firefox или PhantomJS?   -  person Michal Charemza    schedule 26.05.2015
comment
@Manube Не, не съм. И Михал Случва се и във Firefox, да.   -  person Siraris    schedule 26.05.2015
comment
И аз имам същия проблем. Ако имате решението, можете ли да ме уведомите. Мина повече от седмица, но все още има същия проблем.   -  person Rajeshwar    schedule 14.07.2015
comment
Същият проблем. Никъде няма решения. Имам 8 описващи блока в един тест, получавам пълното презареждане на страницата, ако коментирам някое от 8-те описания (намалявайки броя до 7), работи.   -  person ThinkingInBits    schedule 21.10.2015
comment
@MichalCharemza за мен е така - случва се на chrome, но тестовете на firefox преминават добре. Знаете ли каква може да е причината?   -  person topr    schedule 27.06.2016


Отговори (13)


В моя случай проблемът беше, че в моя изходен код имах код, директно задаващ href на обекта location, като window.location.href = 'somewhere' ;

В моите спецификации настроих onbeforeunload слушател, който просто връща низ, вместо да позволи пренасочването да се извърши:

beforeAll(() => {
  window.onbeforeunload = () => 'Oh no!';
});
person jpunk11    schedule 20.05.2016

Уверете се, че вашите тестове правилно изолират всички тествани модули с фалшиви/шпиони. Поведението, което виждате, ми казва, че вашите тестове не се изпълняват наистина изолирано - те променят някакво състояние някъде, което ще задейства презареждане.

person johnmcase    schedule 26.05.2015
comment
Всъщност намерих мястото, след като предложих наградата. И да, прав си за парите. В моя случай презареждането беше задействано след определен брой тестове по някаква причина - поради чакаща http-http заявка към външна система, която изтече точно между тест 13 и 14... ;) - person Christian Dalager; 27.05.2015

Предполагам, че използвате window.location някъде в целевия си код. За да го преминете, просто създайте шпионин за window.onbeforeunload

Пример:

window.onbeforeunload = jasmine.createSpy();

Или дори по-добре използвайте $window вместо това и това няма да се случи.

person Adrian Diaconu    schedule 01.02.2017
comment
Работи, но с аргумент вътре в createSpy - просто низ. - person Easwaramoorthy K; 03.08.2017

Наскоро срещнах тази грешка с Karma 0.13.12. Надстроих до Karma 0.13.14 и тестовете ми отново работят. Проблемът за мен (и вероятно също за @mqklin) беше свързан с https://github.com/karma-runner/karma/issues/1656 и https://github.com/jasmine/jasmine/issues/945.

person mer10z_tech    schedule 02.11.2015

Това, което проработи за мен, беше надграждането на Karma от 1.4.0 на 1.4.1 и промяната на maximumSpecCallbackDepth в моя файл jasmine.js от 20 на 100.

person keimjohn    schedule 30.01.2017
comment
Моля, преформатирайте този отговор и го разширете малко. - person ; 31.01.2017

създаването на шпиониране на функцията, която има window.location / reload, реши проблема за мен

person Sebastian    schedule 26.07.2017
comment
Може ли да бъдеш по-точен? - person Dov Benyomin Sohacheski; 26.07.2017

Също така трябва да се уверите, че модулите не се зареждат два пъти. В моя случай имах файл с модул AngularJS - например auth.controller.js, чието съдържание вече беше пакетирано във файл core.js. След като изключих пакетните файлове на karma, грешката изчезна.

person rebelliard    schedule 28.01.2016

Опитайте се да намалите броя на describe раздели или да ги премахнете напълно. Не знам защо, но при мен работи.

person mqklin    schedule 28.08.2015

Използвах setTimeout(() => window.location.replace('/'), 10); Използвах кода по-долу в моя модулен тест и той работи за мен.

spyOn(global, 'setTimeout');
person satkool007    schedule 12.07.2017

Надяваме се, че сте използвали window.location = "some url" във вашия код; Изправен пред подобен проблем и решен с помощта на промените по-долу.

Заменен window.location в кода с,

window.location.assign("some url");

Направете следното в единичен тест:

spyOn(window.location, "assign").and.callFake(() => {
    // Dummy assign call - so that your actual call will be faked and the reload will not happen. 
});
person Easwaramoorthy K    schedule 03.08.2017
comment
изглежда като хубаво предложение, но получих „присвояването не е обявено за записваемо или няма настройка“ - person ada; 12.07.2018

В случай, че беше обратно извикване ng-submit, което не извиква "event.preventDefault()" и браузърът презарежда страницата. Подигравката с $location не помага в тази ситуация.

person Daneel Yaitskov    schedule 17.01.2018

Това ще реши тази грешка при пренасочване на Karma!

var html = '<script type="text/javascript">';
html += 'window.location = "' + urlToRedirect +'"';
html += '</script>';
$( '.wrapper' ).append( html );
person Debanik Saha    schedule 20.03.2019

Според документацията на angularjs трябва да инжектирате модула $window, за да можете да разрешите проблема с възможността за тестване, който получавате. Ако наистина искате да направите пълно опресняване на страницата, докато маршрутизирате, което ще презареди цялото приложение. Но както и да е...

Така например в компонент

.controller('ExampleController', ['$scope', '$window', function($scope, $window**) 
 {

      $scope.doRerouteWithPageReload = function() {
       return this.$window.location.href = "/myUrl";
 };

И след това във вашия тестов файл импортирате $window в тестовия контролер по вашия начин, след което там, където присвоявате шпиони, можете да направите нещо подобно:

$window = { location: {href: jasmine.createSpy() };

И тогава действителният тест е нещо подобно:

expect($window.location.href).toBe("/myUrl");

Документация на Angularjs, за да прочетете повече за $window.

person Michael R    schedule 24.01.2020