182 votes

Comment simuler window.location.href avec Jest + Vuejs ?

Actuellement, je suis en train d'implémenter un test unitaire pour mon projet et il y a un fichier qui contenait window.location.href .

Je veux faire une simulation pour tester et voici mon exemple de code :

it("method A should work correctly", () => {
      const url = "http://dummy.com";
      Object.defineProperty(window.location, "href", {
        value: url,
        writable: true
      });
      const data = {
        id: "123",
        name: null
      };
      window.location.href = url;
      wrapper.vm.methodA(data);
      expect(window.location.href).toEqual(url);
    });

Mais je reçois cette erreur :

TypeError: Cannot redefine property: href
        at Function.defineProperty (<anonymous>)

J'ai essayé quelques solutions mais je ne l'ai pas résolu. J'ai besoin de quelques conseils pour m'aider à me sortir de ce mauvais pas. Aidez-moi, s'il vous plaît.

1 votes

Cette question a été traitée dans un autre fil de discussion Voici le lien vers la réponse

4 votes

Ce n'est pas exactement ce que vous recherchez mais window.location.assign(url) fait fonctionnellement la même chose, vous pouvez donc le simuler à la place en utilisant la fonction jest.spyOn(window.location, 'assign').mockImplementation(() => {});

199voto

mava Points 1596

Vous pouvez essayer :

global.window = Object.create(window);
const url = "http://dummy.com";
Object.defineProperty(window, 'location', {
  value: {
    href: url
  }
});
expect(window.location.href).toEqual(url);  

Jetez un coup d'œil à l'Issue Jest pour ce problème :
Question de plaisanterie

13 votes

Pour moi, utiliser global n'a pas fonctionné, j'ai supprimé global. et j'ai également dû ajouter writable: true sinon, une fois fixé, les autres tests ne peuvent pas le modifier.

119voto

jabacchetta Points 2067

Mise à jour 2020


Base

El Objet URL a une grande partie des mêmes fonctionnalités que le Objet de l'emplacement . En d'autres termes, il comprend des propriétés telles que pathname , search , hostname etc. Ainsi, dans la plupart des cas, vous pouvez procéder comme suit :

delete window.location
window.location = new URL('https://www.example.com')

Avancé

Vous pouvez également simuler Méthodes de localisation dont vous pourriez avoir besoin et qui n'existent pas sur l'interface URL :

const location = new URL('https://www.example.com')
location.assign = jest.fn()
location.replace = jest.fn()
location.reload = jest.fn()

delete window.location
window.location = location

36 votes

Avec mise à jour du texte, delete window.location déclenchera une erreur The operand of a 'delete' operator must be optional

0 votes

@dhsun une solution au problème que vous avez mentionné ci-dessus ? Je suis confronté à un problème similaire

7 votes

Ajoutez // @ts-ignore au dessus de la ligne delete window.location ; si vous le devez

48voto

Hoang Tran Son Points 493

J'ai résolu ce problème en ajoutant writable: true et le déplacer vers beforeEach

Voici mon exemple de code :

global.window = Object.create(window);
const url = "http://dummy.com";
Object.defineProperty(window, "location", {
    value: {
       href: url
    },
    writable: true
});

2 votes

Cette solution fonctionne également pour écraser window.location.hostname dans les tests de Jest. J'avais besoin writable: true afin de modifier le hostname plus d'une fois.

0 votes

Cela m'aide beaucoup

25voto

user1587329 Points 91

Solution pour 2019 à partir de GitHub :

delete global.window.location;
global.window = Object.create(window);
global.window.location = {
  port: '123',
  protocol: 'http:',
  hostname: 'localhost',
};

1 votes

C'est le seul qui semble fonctionner pour moi et avec une raison utile :)

0 votes

Cela fonctionne, mais les tests suivants qui utilisent postMessage et qui ont besoin de l'original sont interrompus. location.host propriété

22voto

Kaiido Points 35595

Le mieux est probablement de créer un nouveau URL de sorte qu'il analyse votre chaîne de caractères comme suit location.href et met donc à jour toutes les propriétés de l'élément location comme .hash , .search , .protocol etc.

it("method A should work correctly", () => {
  const url = "http://dummy.com/";
  Object.defineProperty(window, "location", {
    value: new URL(url)
  } );

  window.location.href = url;
  expect(window.location.href).toEqual(url);

  window.location.href += "#bar"
  expect(window.location.hash).toEqual("#bar");
});

https://repl.it/repls/VoluminousHauntingFunctions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X