Panduan Sinon.js: Mocking, Stubbing, dan Spying untuk Unit Testing

Pengenalan Sinon.js

Sinon.js adalah pustaka (library) JavaScript yang menyediakan fungsi standalone test spies, stubs, dan mocks untuk pengujian unit. Sinon.js tidak terikat pada framework pengujian tertentu, sehingga dapat digunakan bersama Mocha, Jest, Jasmine, atau QUnit. Inti dari Sinon.js adalah kemampuannya untuk memanipulasi fungsi dan objek tanpa mengubah kode sumber aplikasi Anda.

Konsep Utama Sinon.js

FiturKegunaan Utama
SpiesMelacak pemanggilan fungsi, argumen, dan nilai kembalian.
StubsMengganti fungsi dengan perilaku yang ditentukan (hardcoded).
MocksKombinasi spy dan stub dengan ekspektasi perilaku yang ketat.
Fake TimersMengontrol waktu (setTimeout, setInterval) dalam pengujian.
Fake XHR/FetchMeniru respons jaringan tanpa melakukan request HTTP nyata.

Implementasi Spy

Spy digunakan untuk memverifikasi apakah sebuah fungsi dipanggil dengan argumen yang benar.

const callback = sinon.spy();
function panggilCallback(cb) {
  cb('data');
}

panggilCallback(callback);
console.log(callback.calledOnce); // true
console.log(callback.calledWith('data')); // true

Implementasi Stub

Stub digunakan untuk memaksa fungsi mengembalikan nilai tertentu, sangat berguna untuk mengisolasi unit yang bergantung pada API eksternal.

const user = { getNama: () => 'Nama Asli' };
sinon.stub(user, 'getNama').returns('Nama Palsu');

console.log(user.getNama()); // 'Nama Palsu'

Manajemen Fake Timers

Untuk menguji kode yang menggunakan setTimeout atau setInterval, Sinon menyediakan Fake Timers agar pengujian tidak perlu menunggu waktu nyata.

const clock = sinon.useFakeTimers();
let dipanggil = false;

setTimeout(() => { dipanggil = true; }, 1000);

clock.tick(1000); // Memajukan waktu 1 detik
console.log(dipanggil); // true
clock.restore();

Tips Troubleshooting

  • Selalu gunakan sinon.restore(): Pastikan untuk memanggil sinon.restore() di dalam blok afterEach pada framework testing Anda untuk mencegah kebocoran state antar tes.
  • Hindari Over-mocking: Gunakan stub untuk data, dan spy untuk verifikasi alur. Jangan gunakan mock kecuali Anda benar-benar perlu memverifikasi urutan pemanggilan yang kompleks.
  • Kompatibilitas: Jika menggunakan ES6 Modules, pastikan Anda menggunakan alat bantu seperti babel-plugin-rewire atau proxyquire karena Sinon tidak bisa langsung melakukan stub pada fungsi yang diimpor secara statis.