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
| Metode | Kegunaan | Skenario |
|---|---|---|
| mockResolvedValue | Mengembalikan Promise yang resolve | Simulasi respon API sukses |
| mockRejectedValue | Mengembalikan Promise yang reject | Simulasi error/exception |
| mockImplementation | Definisi logika kustom | Simulasi logika kompleks |
| mockResolvedValueOnce | Resolve hanya untuk satu panggilan | Testing urutan respon |
Langkah Teknis Troubleshooting
- Pastikan Jest Terkonfigurasi: Pastikan
jest.mockdipanggil di tingkat atas (top-level) file tes agar hoisting bekerja dengan benar. - Gunakan Async/Await di Test: Selalu gunakan
asyncpada callback fungsitestatauitagar Jest menunggu Promise selesai sebelum melakukan assertion. - Pembersihan Mock: Gunakan
jest.clearAllMocks()di dalambeforeEachuntuk memastikan state mock tidak bocor antar test case. - 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.