Estoy desarrollando una aplicación reactJs. Estoy usando broma para probar mi aplicación. Quiero probar una función que descarga un blob.
Pero desafortunadamente recibo este error:
URL.createObjectURL no es una función
mi función de prueba:
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 función que quiero probar:
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); };Esto parecería ser tan simple como configurar la URL en Global in Jest. Algo como
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); }); }); Esto debería dar como resultado una prueba que también puede usar para verificar si se llamó a global.URL.createObjectURL . Como nota al margen: también puede encontrarse con un problema similar con window.open . Sugiero burlarse de eso también si este es el caso.
jsdom, la implementación de JavaScript de WHATWG DOM utilizada por jest aún no implementa este método.
Puede encontrar un ticket abierto sobre este problema exacto en su página de github donde se proporcionan algunas soluciones en los comentarios. Pero si necesita que blobURL funcione, tendrá que esperar a que se resuelva este FR.
Solución alternativa propuesta en los comentarios del problema por broma:
function noOp () { } if (typeof window.URL.createObjectURL === 'undefined') { Object.defineProperty(window.URL, 'createObjectURL', { value: noOp}) }Dado que window.URL.createObjectURL (todavía) no está disponible en jest-dom, debe proporcionarle una implementación simulada.
No olvide restablecer la implementación simulada después de cada prueba.
describe("your test suite", () => { window.URL.createObjectURL = jest.fn(); afterEach(() => { window.URL.createObjectURL.mockReset(); }); it("your test case", () => { expect(true).toBeTruthy(); }); });