javascriptjestjs

Jest: Testing window.location.reload


How do I write a test that makes sure that the method reloadFn does in fact reload the window? I found this resource but I am unclear on how to expect a window reload when writing a test when that window reload happens in a given function. Thanks for the help!

const reloadFn = () => {
  window.location.reload();
}

Solution

  • Updated Answer (November 2021)

    Package: "jest": "^26.6.0" "@testing-library/jest-dom": "^5.11.4"

    Build: create-react-app 4

    describe("test window location's reload function", () => {
      const original = window.location;
    
      const reloadFn = () => {
        window.location.reload();
      };
    
      beforeAll(() => {
        Object.defineProperty(window, 'location', {
          configurable: true,
          value: { reload: jest.fn() },
        });
      });
    
      afterAll(() => {
        Object.defineProperty(window, 'location', { configurable: true, value: original });
      });
    
      it('mocks reload function', () => {
        expect(jest.isMockFunction(window.location.reload)).toBe(true);
      });
    
      it('calls reload function', () => {
        reloadFn(); // as defined above..
        expect(window.location.reload).toHaveBeenCalled();
      });
    });
    
    

    Note: Updated answer because the the old answer wasn't supported with latest jest version used in CRA.


    Old answer

    Here’s the solution but refactored for better organization:

    describe('test window location\'s reload function', () => {
      const { reload } = window.location;
    
      beforeAll(() => {
        Object.defineProperty(window.location, 'reload', {
          configurable: true,
        });
        window.location.reload = jest.fn();
      });
    
      afterAll(() => {
        window.location.reload = reload;
      });
    
      it('mocks reload function', () => {
        expect(jest.isMockFunction(window.location.reload)).toBe(true);
      });
    
      it('calls reload function', () => {
        reloadFn(); // as defined above..
        expect(window.location.reload).toHaveBeenCalled();
      });
    });
    

    Thanks :)