Некоторые из ваших тестов выполнили полную перезагрузку страницы — ошибка при запуске тестов Jasmine

Я столкнулся с проблемой, когда я запускаю свои тесты на Жасмин, я получаю эту ошибку ниже. Проблема в том, что это происходит, когда я пытаюсь выполнить определенное количество тестов. Вроде не привязан к конкретному тесту, как будто я некоторые закомментирую, тесты проходят. Если я раскомментирую некоторые тесты, появится ошибка. Если я закомментирую те, которые были раскомментированы ранее, все они снова пройдут. (т.е. если у меня есть красный, зеленый, синий и оранжевый тест, и он терпит неудачу, я закомментирую оранжевый и синий, он проходит, затем я раскомментирую синий и оранжевый, он снова терпит неудачу, но если я закомментирую красный и зеленый, он снова проходит).

Chrome 41.0.2272 (Mac OS X 10.10.1) ОШИБКА Некоторые из ваших тестов привели к полной перезагрузке страницы! Chrome 41.0.2272 (Mac OS X 10.10.1): выполнено 16 из 29 (1 FAILED) ОШИБКА (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 для меня это так - это происходит на хроме, но на 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

Убедитесь, что ваши тесты правильно изолируют все тестируемые модули с помощью mocks/spy. Поведение, которое вы видите, говорит мне, что ваши тесты на самом деле не работают изолированно — они где-то меняют какое-то состояние, которое вызовет перезагрузку.

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 и изменение maxSpecCallbackDepth в моем файле 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. Как только я исключил на карме файлы в комплекте, ошибка исчезла.

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

Это решит эту ошибку перенаправления кармы!

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