Cara Mocking Async Functions di JavaScript dengan Jest

Teknik Mocking Fungsi Asinkron

Mocking fungsi asinkron dalam JavaScript, khususnya saat menggunakan framework pengujian seperti Jest, dilakukan dengan mengganti implementasi asli fungsi tersebut dengan fungsi tiruan (mock) yang mengembalikan Promise. Kunci utamanya adalah menggunakan metode mockResolvedValue untuk mensimulasikan keberhasilan (resolve) atau mockRejectedValue untuk mensimulasikan kegagalan (reject).

Implementasi Dasar dengan Jest

Berikut adalah contoh implementasi untuk melakukan mocking pada modul yang mengekspor fungsi asinkron:

// api.js
export const fetchData = async () => {
  const response = await fetch('/data');
  return response.json();
};

// api.test.js
import { fetchData } from './api';
import { fetch } from 'node-fetch';

jest.mock('./api');

test('mocking async function success', async () => {
  const mockData = { id: 1, name: 'Azwinn' };
  fetchData.mockResolvedValue(mockData);

  const result = await fetchData();
  expect(result).toEqual(mockData);
});

test('mocking async function failure', async () => {
  fetchData.mockRejectedValue(new Error('API Down'));

  await expect(fetchData()).rejects.toThrow('API Down');
});

Tabel Perbandingan Metode Mocking

MetodeKegunaanSkenario
mockResolvedValueMengembalikan Promise yang resolveSimulasi respon API sukses
mockRejectedValueMengembalikan Promise yang rejectSimulasi error/exception
mockImplementationDefinisi logika kustomSimulasi logika kompleks
mockResolvedValueOnceResolve hanya untuk satu panggilanTesting urutan respon

Langkah Teknis Troubleshooting

  1. Pastikan Jest Terkonfigurasi: Pastikan jest.mock dipanggil di tingkat atas (top-level) file tes agar hoisting bekerja dengan benar.
  2. Gunakan Async/Await di Test: Selalu gunakan async pada callback fungsi test atau it agar Jest menunggu Promise selesai sebelum melakukan assertion.
  3. Pembersihan Mock: Gunakan jest.clearAllMocks() di dalam beforeEach untuk memastikan state mock tidak bocor antar test case.
  4. Cek Export: Pastikan fungsi yang di-mock diimpor dengan benar dari modul yang sama dengan yang digunakan dalam kode sumber.

Dalam pengujian unit, tujuan utama mocking adalah mengisolasi unit kode yang sedang diuji dari dependensi eksternal seperti database atau API pihak ketiga. Dengan mengontrol output dari fungsi asinkron, Anda dapat memastikan bahwa logika bisnis aplikasi Anda tetap berjalan sesuai ekspektasi meskipun layanan eksternal sedang tidak tersedia.