Jest URL.createObjectURL is not a function

前端 未结 4 1469
[愿得一人]
[愿得一人] 2021-01-17 07:39

I\'m developping a reactJs application. I\'m using jest to test my application. I want to test a function that download a blob.

But unfortunately I receve this error

相关标签:
4条回答
  • 2021-01-17 07:57

    You just have to Write this in your setupTest.js

    window.URL.createObjectURL = function() {};
    
    0 讨论(0)
  • 2021-01-17 08:06

    This would appear to be as simple as setting up URL on the Global in Jest. Something like

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

    This should result in a test that you can also use for checking if global.URL.createObjectURL was called. As a side note: you may also run into a similar issue with window.open I would suggest mocking that as well if this becomes the case.

    0 讨论(0)
  • 2021-01-17 08:06

    jsdom, the JavaScript implementation of the WHATWG DOM used by jest doesn't implement this method yet.

    You can find an open ticket about this exact issue on their github page where some workarounds are provided in comments. But if you need the blobURL to actually work you'll have to wait this FR is solved.

    Workaround proposed in the comments of the issue for jest:

    function noOp () { }
    if (typeof window.URL.createObjectURL === 'undefined') { 
      Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
    }
    
    0 讨论(0)
  • 2021-01-17 08:11

    Since window.URL.createObjectURL is not (yet) available in jest-dom, you need to provide a mock implementation for it.

    Don't forget to reset the mock implementation after each test.

    describe("your test suite", () => {
      window.URL.createObjectURL = jest.fn();
    
      afterEach(() => {
        window.URL.createObjectURL.mockReset();
      });
    
      it("your test case", () => {
        expect(true).toBeTruthy();
      });
    });
    
    0 讨论(0)
提交回复
热议问题