Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

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

Writer Matthew Harrington

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.

8

14 Answers

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!';
});
0

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.

1

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.

1

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.

3

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 and .

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.

1

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

1

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.
});
1

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.

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

0

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

spyOn(global, 'setTimeout');

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.

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.

It will solve this Karma redirect error!

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.