Fix Jest Matchmedia Not Defined

3 menit baca.

Kalau kamu测试 React komponen yang pakai window.matchMedia, Jest akan crash dengan error TypeError: window.matchMedia is not a function. API browser ini tidak ada di environment jsdom.

Kenapa terjadi

Jest menjalankan test di Node.js dengan jsdom, yang tidak mengimplementasikan window.matchMedia. Semua kode yang memanggil matchMedia — umum di komponen responsif, media query hooks, atau UI library — akan gagal.

Solusinya

Tambahkan mock ini di file setup Jest:

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

Kalau pakai versi Jest/jsdom yang lebih lama, kamu mungkin butuh addListener dan removeListener (seperti di atas). Versi yang lebih baru pakai addEventListener/removeEventListener.

Buat return true untuk query tertentu

Kalau test kamu perlu matchMedia return matches: true:

window.matchMedia = jest.fn().mockImplementation(query => {
  if (query === '(min-width: 768px)') {
    return {
      matches: true,
      media: query,
      onchange: null,
      addListener: jest.fn(),
      removeListener: jest.fn(),
      addEventListener: jest.fn(),
      removeEventListener: jest.fn(),
      dispatchEvent: jest.fn(),
    };
  }
  return {
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(),
    removeListener: jest.fn(),
    addEventListener: jest.fn(),
    removeEventListener: jest.fn(),
    dispatchEvent: jest.fn(),
  };
});

Verify kalau berhasil

it('renders differently on mobile', () => {
  render(<MyComponent />);
  expect(window.matchMedia).toHaveBeenCalled();
});

Selesai. Mock ini kasih kamu matchMedia yang bekerja dengan predictable di test.

Latest Posts