it-roy-ru.com

Jest URL.createObjectURL не является функцией

Я разрабатываю приложение ReactionJs. Я использую шутку, чтобы проверить свое приложение. Я хочу проверить функцию, которая загружает BLOB-объекты.

Но, к сожалению, я получаю эту ошибку:

URL.createObjectURL не является функцией

моя тестовая функция:

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

Функция, которую я хочу проверить:

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

Казалось бы, это так же просто, как настроить URL в Global in Jest. Что-то вроде

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

Это должно привести к тесту, который вы также можете использовать для проверки, был ли вызван global.URL.createObjectURL. В качестве дополнительного примечания: вы также можете столкнуться с аналогичной проблемой с window.open. Я бы посоветовал также посмеяться над этим, если это произойдет.

4
Moosecouture

jsdom, реализация JavaScript WHATWG DOM, используемая jest, пока не реализует этот метод. 

Вы можете найти открытый тикет об этой конкретной проблеме на их странице github где некоторые обходные пути предоставлены в комментариях. Но если вам нужно, чтобы blobURL действительно работал, вам придется подождать, пока этот FR не будет решен.

Обходной путь, предложенный в комментариях к проблеме для шутки:

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