0

I am trying to setup Jest to verify behavior tied to a custom useMediaQuery() hook, but I'm finding that the documented mocks may be interfering.

useMediaQuery() borrowed from Netlify

import { useState, useEffect } from 'react';

export function useMediaQuery(query) {
  const [matches, setMatches] = useState(false);

  useEffect(() => {
    const media = window.matchMedia(query);
    if (media.matches !== matches) {
      setMatches(media.matches);
    }
    const listener = () => {
      setMatches(media.matches);
    };
    media.addListener(listener);
    return () => media.removeListener(listener);
  }, [matches, query]);

  return matches;
}

window.matchMedia mock lifted from Jest docs

Object.defineProperty(window, 'matchMedia', {
  writable: true,
  value: jest.fn().mockImplementation(query => ({
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(), // Deprecated
    removeListener: jest.fn(), // Deprecated
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  })),
});

Test setup derived from here and here

// When the viewport with is <= 600px, Component internally chooses a hardcoded truncated site title
it(`renders truncated siteTitle when viewport is small or less`, () => {
  const siteTitle = `Full Title`
  const truncatedSiteTitle = `FT`
  const { getByText, rerender } = render(<Component
    siteTitle={siteTitle}
    actions={actions}
  />)

  fireResize(300)

  rerender(<Component
    siteTitle={siteTitle}
    actions={actions}
  />)

  const title = getByText(truncatedSiteTitle)
  expect(title).toBeInTheDocument()
})
Drew Reese
  • 165,259
  • 14
  • 153
  • 181
Kwhitejr
  • 2,206
  • 5
  • 29
  • 49

0 Answers0