webentwicklung-frage-antwort-db.com.de

Jest URL.createObjectURL ist keine Funktion

Ich entwickle eine reaktionsfähige Anwendung. Ich benutze Scherz, um meine Anwendung zu testen. Ich möchte eine Funktion testen, die einen Blob herunterlädt.

Aber leider erhalte ich diesen Fehler:

URL.createObjectURL ist keine Funktion

meine Testfunktion:

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

Die Funktion, die ich testen möchte:

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

Dies scheint so einfach zu sein wie das Einrichten von URL auf dem Global in Jest. Etwas wie

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

Dies sollte zu einem Test führen, mit dem Sie auch prüfen können, ob global.URL.createObjectURL hieß. Als Randnotiz: Möglicherweise stoßen Sie auch auf ein ähnliches Problem mit window.open Ich würde vorschlagen, das auch zu verspotten, wenn dies der Fall ist.

4
Moosecouture

jsdom, die von jest verwendete JavaScript-Implementierung des WHATWG-DOM implementiert diese Methode noch nicht.

Sie finden ein offenes Ticket zu genau diesem Problem auf ihrer Github-Seite , wo einige Problemumgehungen in Kommentaren angegeben sind. Aber wenn Sie die blobURL brauchen, um tatsächlich zu funktionieren, müssen Sie warten, bis diese FR gelöst ist.

Problemumgehung in den Kommentaren des Problems für Scherz vorgeschlagen:

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