Some of your tests did a full page reload - error when running Jasmine tests

AngularjsUnit TestingJasmineKarma Jasmine

Angularjs Problem Overview


I'm running into an issue where when I run my tests on Jasmine, I get this error below. The problem is, it seems to happen when I try to execute a certain amount of tests. It doesn't seem to be tied to a particular test, as if I comment out some, the tests pass. If I uncomment some tests, the error appears. If I comment out ones that were uncommented before, they all pass again. (ie if I have red, green, blue and orange test and it fails, I comment out orange and blue it passes, then I uncomment blue and orange it fails again, but if I comment out red and green it passes again).

> Chrome 41.0.2272 (Mac OS X 10.10.1) ERROR Some of your tests did a > full page reload! Chrome 41.0.2272 (Mac OS X 10.10.1): Executed 16 of > 29 (1 FAILED) ERROR (0.108 secs / 0.092 secs)

I'm stumped as to what is going on. The more tests I add, that's when this becomes an issue. Has anyone encountered this before? I have no idea what could be causing it, as nothing in any of my tests do any kind of redirection, and they all pass universally on another persons machine.

Angularjs Solutions


Solution 1 - Angularjs

In my case the problem was that in my source code I had code directly setting the href on the location object, like window.location.href = 'somewhere';

In my specs I set up a onbeforeunload listener that just returns a string instead of allowing the redirect to take place:

beforeAll(() => {
  window.onbeforeunload = () => 'Oh no!';
});

Solution 2 - Angularjs

Make sure that your tests are properly isolating all modules under test with mocks/spies. The behavior you are seeing says to me that your tests are not truly running in isolation - they are changing some state somewhere that will trigger a reload.

Solution 3 - Angularjs

I suppose you are using window.location somewhere in your targeted code. In order to pass it just create a spy for the window.onbeforeunload

Example:

window.onbeforeunload = jasmine.createSpy();

Or even better use $window instead, and this will not happen.

Solution 4 - Angularjs

I recently encountered this error with Karma 0.13.12. I upgraded to Karma 0.13.14 and my tests work again. The problem for me (and probably also for @mqklin) was related to https://github.com/karma-runner/karma/issues/1656 and https://github.com/jasmine/jasmine/issues/945.

Solution 5 - Angularjs

What worked for me was upgrading Karma from 1.4.0 to 1.4.1 and changing the maximumSpecCallbackDepth in my jasmine.js file from 20 to 100.

Solution 6 - Angularjs

creating a spy on the function which has the window.location / reload fixed the issue for me

Solution 7 - Angularjs

Try to reduce amount of describe sections or completely remove them. I don't know why, but it works for me.

Solution 8 - Angularjs

You also need to make sure that modules are not being loaded twice. In my case, I had an AngularJS module file -e.g., auth.controller.js which contents were already bundled in a core.js file. Once I excluded the bundled files on karma, the error disappeared.

Solution 9 - Angularjs

I was using setTimeout(() => window.location.replace('/'), 10); I used below code in my unit test and it worked for me.

spyOn(global, 'setTimeout');

Solution 10 - Angularjs

Hope you have used window.location = "some url" in your code; Faced similar problem, and solved by using the below changes.

Replaced window.location in the code with,

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

Do the below in unit test:

spyOn(window.location, "assign").and.callFake(() => {
    // Dummy assign call - so that your actual call will be faked and the reload will not happen. 
});

Solution 11 - Angularjs

In case it was ng-submit callback, which doesn't call "event.preventDefault()" and the browser reloads page. Mocking $location doesn't help in that situation.

Solution 12 - Angularjs

It will solve this Karma redirect error!

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

Solution 13 - Angularjs

According to angularjs documentation you should inject the $window module to be able to solve the testability issue you get. If you really want to do a full page refresh while routing, which will reload the whole application. But anyway...

So for example in component

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

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

And then in your test-file you import $window to the test-controller your way, then where you assign spies you can do something like this:

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

And then the actual test is something like this:

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

Angularjs documentation for reading more about $window.

Solution 14 - Angularjs

There are many ways this error can happen.

If your component has a form element, this might be the cause.

Whenever a button on the form is clicked, this error can happen, even tho your component contains no navigation logic.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSirarisView Question on Stackoverflow
Solution 1 - Angularjsjpunk11View Answer on Stackoverflow
Solution 2 - AngularjsjohnmcaseView Answer on Stackoverflow
Solution 3 - AngularjsAdrian DiaconuView Answer on Stackoverflow
Solution 4 - Angularjsmer10z_techView Answer on Stackoverflow
Solution 5 - AngularjskeimjohnView Answer on Stackoverflow
Solution 6 - AngularjsSebastianView Answer on Stackoverflow
Solution 7 - AngularjsmqklinView Answer on Stackoverflow
Solution 8 - AngularjsrebelliardView Answer on Stackoverflow
Solution 9 - Angularjssatkool007View Answer on Stackoverflow
Solution 10 - AngularjsEaswaramoorthy KView Answer on Stackoverflow
Solution 11 - AngularjsDaniil IaitskovView Answer on Stackoverflow
Solution 12 - AngularjsDebanik SahaView Answer on Stackoverflow
Solution 13 - AngularjsMichael RView Answer on Stackoverflow
Solution 14 - AngularjsRyanView Answer on Stackoverflow