151 votes

Comment se moquer de l'objet window JavaScript en utilisant Jest?

J'ai besoin de tester une fonction qui ouvre un nouvel onglet dans le navigateur

  openStatementsReport(contactIds) {
    window.open(`a_url_${contactIds}`);
  }

Je voudrais, à se moquer de la fenêtre ouverte de la fonction afin que je puisse vérifier la bonne URL est transmise à la fonction d'ouverture.

À l'aide de Plaisanterie, je ne sais pas comment faire pour se moquer de la fenêtre. J'ai essayé de mettre de la fenêtre.ouvrir avec un simulacre de fonction, mais de cette façon ne fonctionne pas. Ci-dessous est le cas de test

it('correct url is called', () => {
  window.open = jest.fn();
  statementService.openStatementsReport(111);
  expect(window.open).toBeCalled();
});

mais il me donne l'erreur

expect(jest.fn())[.not].toBeCalled()

    jest.fn() value must be a mock function or spy.
    Received:
      function: [Function anonymous]

que dois-je faire pour le cas de test? des suggestions ou des conseils sont appréciés

105voto

Andreas Köberle Points 16453

Au lieu de window utiliser global

 it('correct url is called', () => {
  global.open = jest.fn();
  statementService.openStatementsReport(111);
  expect(global.open).toBeCalled();
});
 

tu pourrais aussi essayer

 const open = jest.fn()
Object.defineProperty(window, 'open', open);
 

13voto

Poh Zi How Points 310

Nous pouvons également le définir en utilisant global en setupTests

 // setupTests.js
global.open = jest.fn()
 

Et appelez-le en utilisant global dans le test réel:

 // yourtest.test.js
it('correct url is called', () => {
    statementService.openStatementsReport(111);
    expect(global.open).toBeCalled();
});
 

5voto

abhishek khandait Points 191

Vous pouvez essayer ceci:

 import * as _Window from "jsdom/lib/jsdom/browser/Window";

window.open = jest.fn().mockImplementationOnce(() => {
    return new _Window({ parsingMode: "html" });
});

it("correct url is called", () => {
    statementService.openStatementsReport(111);
    expect(window.open).toHaveBeenCalled();
});
 

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