The bottom line is that you can not mock window.location, BUT you can delete it and create your own to use in test. I will here show one example of how this can be achived:
describe('methodUnderTest', () => {
// Save current windows.location
const oldWindowLocation = window.location;
// Some mocked value
const mockedUrl = 'https://blog.niklasottosson.com';
beforeEach(() => {
// Remove windows.location so that we can create a new
delete window.location;
// Create a new mutable window.location
window.location = Object.defineProperties(
{},
{ // copy all properties from the old window.location
...Object.getOwnPropertyDescriptors(oldWindowLocation),
// Start mocking...
assign: {
configurable: true,
value: jest.fn()
},
href: {
configurable: true,
value: mockedUrl
}
);
});
afterEach(() => {
// Restore window.location
window.location = oldWindowLocation;
});
// Start creating your tests...
it('should...', () => {
...
}
Tested on OSX 10.15.7, Vue v2.6.12 and Jest v26.0.14