web-dev-qa-db-ja.com

Jest URL.createObjectURLは関数ではありません

私はreactJsアプリケーションを開発しています。アプリケーションのテストにjestを使用しています。 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);
};
16
Melchia

これは、JestのグローバルにURLを設定するのと同じくらい簡単に見えます。何かのようなもの

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、jestで使用されるWHATWG DOMのJavaScript実装は、このメソッドをまだ実装していません。

この問題に関するオープンチケットgithubページ で見つけることができます。いくつかの回避策はコメントで提供されています。しかし、実際に機能するblobURLが必要な場合は、このFRが解決されるまで待つ必要があります。

Jestの問題のコメントで提案された回避策:

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