web-dev-qa-db-fra.com

Jest URL.createObjectURL n'est pas une fonction

Je développe une application reactJs. J'utilise plaisanterie pour tester mon application. Je veux tester une fonction qui télécharge un blob.

Mais malheureusement, je reçois cette erreur:

URL.createObjectURL n'est pas une fonction

ma fonction de test:

describe('download', () => {
    const documentIntial = { content: 'aaa' };
    it('msSaveOrOpenBlob should not have been called when navigao is undefined', () => {
      window.navigator.msSaveOrOpenBlob = null;
      download(documentIntial);
      expect(window.navigator.msSaveOrOpenBlob).toHaveBeenCalledTimes(0);
    });
  });

La fonction que je veux tester:

export const download = document => {
  const blob = new Blob([base64ToArrayBuffer(document.content)], {
    type: 'application/pdf',
  });
  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveOrOpenBlob(blob);
    return;
  }

  const fileURL = URL.createObjectURL(blob);
  window.open(fileURL);
};
16
Melchia

Cela semble être aussi simple que de configurer URL sur Global dans Jest. Quelque chose comme

describe('download', () => {
  const documentIntial = { content: 'aaa' };
  global.URL.createObjectURL = jest.fn();
  it('msSaveOrOpenBlob should not have been called when navigao is undefined', () => {
    global.URL.createObjectURL = jest.fn(() => 'details');
window.navigator.msSaveOrOpenBlob = jest.fn(() => 'details');
download(documentIntial);
expect(window.navigator.msSaveOrOpenBlob).toHaveBeenCalledTimes(1);
  });
});

Cela devrait entraîner un test que vous pouvez également utiliser pour vérifier si global.URL.createObjectURL a été appelé. Remarque: vous pouvez également rencontrer un problème similaire avec window.open Je suggérerais de me moquer de cela aussi si cela devenait le cas.

4
Moosecouture

jsdom, l'implémentation JavaScript du DOM WHATWG utilisé par jest n'implémente pas encore cette méthode.

Vous pouvez trouver un ticket ouvert sur ce problème exact sur leur page github où certaines solutions de contournement sont fournies dans les commentaires. Mais si vous avez besoin de blobURL pour fonctionner, vous devrez attendre que ce FR soit résolu.

Solution proposée dans les commentaires de la question pour plaisanter:

function noOp () { }
if (typeof window.URL.createObjectURL === 'undefined') { 
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}
0
Kaiido