Jika pengujian Node.js Anda gagal karena API pihak ketiga tidak berfungsi, lambat, atau terbatas laju (rate-limited), Anda tidak memiliki masalah kode. Anda memiliki masalah dependensi. Solusinya adalah memalsukan (mock) lapisan HTTP agar pengujian unit Anda berjalan dengan cara yang sama setiap saat, dan nock adalah paket npm yang paling sering digunakan pengembang Node. Panduan ini menjelaskan apa itu nock, menunjukkan contoh kecil yang berfungsi, dan membahas di mana server mock bersama lebih cocok daripada intersep dalam proses. Untuk referensi pustaka lengkap, repositori GitHub nock adalah sumber kebenaran.
Apa itu nock?
nock adalah pustaka ekspektasi dan pemalsuan (mocking) server HTTP untuk Node.js. Ia bekerja dengan menimpa modul http dan https Node pada saat runtime, sehingga setiap permintaan keluar yang dibuat kode Anda dapat diintersep dan dijawab dengan respons yang telah disiapkan. Tidak ada yang meninggalkan mesin Anda. Panggilan jaringan tidak pernah terjadi.
Itu penting untuk pengujian unit. Ketika Anda menguji fungsi yang memanggil API eksternal, Anda tidak ingin memukul layanan nyata. Panggilan nyata lambat, memakan biaya, dapat gagal karena alasan yang tidak terkait dengan kode Anda, dan membuat rangkaian pengujian Anda tidak deterministik. nock memungkinkan Anda mengatakan "ketika kode saya membuat permintaan GET ke URL ini, kembalikan JSON persis ini dengan kode status ini." Pengujian Anda kemudian menegaskan bagaimana fungsi Anda menangani respons tersebut.
nock khusus Node.js. Ia terhubung ke tumpukan HTTP asli, jadi ia bekerja dengan fetch, axios, got, node-fetch, dan apa pun yang dibangun di atas http/https. Ia memiliki jutaan unduhan mingguan dan telah menjadi pilihan default untuk pengujian backend selama bertahun-tahun. Anda menginstalnya sebagai dependensi pengembangan karena hanya berjalan dalam pengujian, tidak pernah dalam produksi.
Contoh nock kecil
Misalnya Anda memiliki fungsi yang mengambil pengguna dari API. Ini fungsinya:
// user-service.js
export async function getUser(id) {
const res = await fetch(`https://api.example.com/users/${id}`);
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
return res.json();
}
Sekarang, ini adalah pengujian yang menggunakan nock untuk mengintersep permintaan:
// user-service.test.js
import nock from 'nock';
import { getUser } from './user-service.js';
test('returns the user when the API responds', async () => {
nock('https://api.example.com')
.get('/users/42')
.reply(200, { id: 42, name: 'Ada Lovelace' });
const user = await getUser(42);
expect(user).toEqual({ id: 42, name: 'Ada Lovelace' });
});
Bacalah dari atas ke bawah. nock('https://api.example.com') mengatur host yang ingin Anda intersep. .get('/users/42') mencocokkan metode dan jalur. .reply(200, {...}) mendefinisikan status dan isi untuk dikembalikan. Ketika getUser(42) berjalan, panggilan jaringan nyata diganti dan respons yang telah Anda siapkan kembali.
Anda dapat memalsukan kesalahan dengan cara yang sama, yang merupakan bagian yang sering dilupakan orang untuk diuji:
test('throws when the API returns 500', async () => {
nock('https://api.example.com')
.get('/users/99')
.reply(500);
await expect(getUser(99)).rejects.toThrow('Request failed: 500');
});
Menguji jalur yang tidak menyenangkan adalah di mana pemalsuan menunjukkan nilainya. Anda tidak dapat secara andal membuat API langsung mengembalikan 500 sesuai permintaan, tetapi Anda dapat memalsukannya dalam satu baris. Jika simulasi kesalahan adalah tujuan utama Anda, panduan ini tentang cara memalsukan respons kesalahan server internal 500 akan membahas lebih dalam.
Fitur nock yang berguna untuk diketahui
Beberapa metode sering muncul setelah Anda melewati dasar-dasar.
.persist()menjaga interceptor tetap hidup di beberapa panggilan. Secara default, nock menghapus interceptor setelah dicocokkan sekali, yang bagus untuk menegaskan bahwa permintaan terjadi tepat satu kali. Gunakan.persist()ketika titik akhir yang sama dipukul berulang kali dalam satu pengujian..times(n)mencocokkan permintaan yang sama beberapa kali sebelum interceptor kedaluwarsa..delay(ms)mensimulasikan respons lambat sehingga Anda dapat menguji penanganan waktu habis (timeout).- Pencocokan RegExp memungkinkan host atau jalur menjadi pola alih-alih string tetap, berguna ketika ID atau string kueri bervariasi.
nock.cleanAll()menghapus semua interceptor. Jalankan ini di antara pengujian agar mock satu pengujian tidak bocor ke pengujian berikutnya.
Satu kebiasaan yang patut dibangun sejak awal: pastikan semua mock Anda benar-benar digunakan. Panggil scope.done() pada interceptor (atau nock.isDone()) dan pengujian akan gagal jika permintaan yang diharapkan tidak pernah terpicu. Itu mengubah panggilan yang terlewat secara diam-diam menjadi kegagalan yang jelas.
Di mana nock berhenti menjadi alat yang tepat
nock dibangun untuk satu pekerjaan dan melakukannya dengan baik: mengintersep HTTP di dalam satu proses Node selama pengujian otomatis. Begitu kebutuhan Anda melintasi batas proses, model itu mulai tegang.
Inilah keterbatasannya. Mock nock hidup di dalam file pengujian Anda, dalam runtime Anda, dalam bahasa Anda. Pengembang front-end tidak dapat mengarahkan browser mereka ke pengaturan nock Anda. Insinyur seluler tidak dapat memukulnya dari simulator. Tim QA Anda tidak dapat menjalankan pemeriksaan manual terhadapnya. Koleksi Postman tidak dapat mencapainya. Mock hanya ada selama proses Jest atau Mocha Anda berjalan, dan hanya untuk kode dalam proses yang sama itu.
Itu baik untuk pengujian unit dan persis seperti yang dirancang nock. Tetapi banyak situasi nyata membutuhkan mock yang hidup di tempat yang dapat dijangkau semua orang:
- Front end perlu dibangun terhadap titik akhir sebelum back end ada.
- Tiga tim di repositori yang berbeda perlu menyepakati respons palsu yang sama.
- Anda ingin mendemokan integrasi tanpa backend langsung.
- Seorang penguji ingin mengutak-atik kasus ekstrem secara manual, tanpa perlu kode.
Untuk itu, Anda menginginkan server mock, sesuatu yang mendengarkan URL nyata dan mengembalikan respons kepada siapa pun yang memanggilnya. Jika Anda menimbang kedua ide tersebut, server mock vs server nyata dan penjelasan yang lebih luas tentang pemalsuan API keduanya menjelaskan pertukaran tersebut.
nock vs server mock terhosting (Apidog)
Anggap saja sebagai dua lapisan daripada kompetisi. nock menangani intersep dalam kode untuk pengujian unit. Alat seperti Apidog memberi Anda server mock bersama yang didorong skema untuk semua yang terjadi di luar proses pengujian tunggal. Banyak tim menggunakan keduanya.

Apidog menghasilkan server mock langsung dari desain API Anda. Anda mendefinisikan titik akhir dan skemanya, dan Apidog menyajikan respons realistis di URL langsung, dengan aturan mock cerdas yang menghasilkan data yang masuk akal dari nama bidang dan jenis. Tanpa harness pengujian, tanpa pengaturan per pengujian, tanpa keterikatan bahasa. Siapa pun dengan URL mendapatkan respons yang sama.
| nock | Server mock Apidog | |
|---|---|---|
| Tempat berjalan | Di proses pengujian Node Anda | Server terhosting dengan URL nyata |
| Terbaik untuk | Pengujian unit, simulasi kesalahan | Integrasi, pengujian manual, kerja lintas tim |
| Siapa yang dapat mencapainya | Kode dalam proses yang sama | Klien apa pun dengan URL |
| Pengaturan | Kode di setiap file pengujian | Dihasilkan dari skema API Anda |
| Bahasa | Hanya Node.js | Klien apa pun, bahasa apa pun |
| Data realistis | Anda menulis setiap respons | Mock cerdas dari skema dan nama bidang |
| Berbagi | Tidak dapat dibagikan | Dibagikan ke seluruh tim |
Agar jelas tentang cakupan: Apidog tidak menggantikan nock di dalam pengujian unit Jest atau Mocha Anda. Jika Anda perlu mengintersep panggilan fetch dalam satu pengujian dan menegaskan hasilnya, nock masih merupakan alat yang tepat. Apidog masuk ketika mock membutuhkan alamat yang dapat dijangkau oleh orang lain dan alat lain. Untuk tampilan langsung dari sisi server, lihat panduan praktis untuk memalsukan API untuk pengujian. Anda dapat mengunduh Apidog dan menjalankan mock dari file OpenAPI yang ada dalam beberapa menit.
Alternatif lain untuk nock
nock bukan satu-satunya pustaka di area ini, dan pilihan yang tepat tergantung pada di mana kode Anda berjalan.
MSW (Mock Service Worker)mengintersep permintaan pada tingkat jaringan menggunakan service worker di browser dan interceptor Node di server. Definisi mock yang sama berfungsi di keduanya, itulah sebabnya banyak tim sekarang secara default menggunakannya untuk JavaScript full-stack. Dokumentasi resmi MSW menjelaskan modelnya.Jest manual mocksmemungkinkan Anda mengganti modul sepertiaxiosdengan yang palsu. Ini lebih sederhana daripada nock untuk kasus kecil tetapi mengikat Anda pada satu klien HTTP. Tutorial mocking Jest membahas polanya.Built-in test doublesdi penjalur pengujian Node sendiri atau pustaka seperti Sinon dapat meng-stub fungsi yang membuat panggilan, meskipun Anda kehilangan pencocokan tingkat HTTP nock.
Pertanyaan penentu selalu sama. Apakah Anda menguji logika di dalam satu proses, atau Anda memerlukan API palsu yang hidup di jaringan? nock dan MSW menjawab yang pertama. Server mock terhosting menjawab yang kedua.
Pertanyaan yang Sering Diajukan
Apakah nock gratis?
Ya. nock adalah sumber terbuka di bawah lisensi MIT dan gratis untuk diinstal dari npm. Anda menambahkannya sebagai dependensi pengembangan dan menggunakannya di rangkaian pengujian Anda tanpa biaya.
Apakah nock bekerja dengan fetch dan axios?
Ya. Karena nock mengintersep pada lapisan http/https Node, ia bekerja dengan klien apa pun yang dibangun di atas modul-modul tersebut, termasuk fetch asli, axios, got, dan node-fetch. Anda menulis interceptor yang sama terlepas dari mana yang digunakan kode Anda.
Bisakah saya menggunakan nock di browser?
Tidak. nock khusus Node.js karena ia menambal modul HTTP Node, yang tidak ada di browser. Untuk pemalsuan sisi browser, gunakan MSW atau arahkan front end Anda ke server mock terhosting. Ikhtisar tentang API mock di JavaScript ini menjelaskan opsi browser.
Apa perbedaan antara nock dan server mock?
nock mengintersep permintaan di dalam proses pengujian Anda dan tidak pernah membuka port nyata. Server mock mendengarkan URL aktual yang dapat dipanggil oleh klien mana pun. Gunakan nock untuk pengujian unit; gunakan server mock ketika front end, QA, atau tim lain perlu mencapai respons palsu yang sama.
Kesimpulan
nock adalah pilihan yang dapat diandalkan untuk pemalsuan HTTP dalam pengujian unit Node.js. Ia mengintersep permintaan keluar dalam proses, mengembalikan respons yang Anda definisikan, dan membuat rangkaian pengujian Anda cepat dan deterministik, termasuk jalur kesalahan yang tidak dapat Anda picu terhadap API langsung. Terus gunakan itu untuk tujuan tersebut.
Ketika mock perlu meninggalkan file pengujian Anda, ketika front end, QA, atau tim lain harus memukul titik akhir yang sama, gunakanlah server mock bersama. Apidog menghasilkannya dari skema API Anda dan menyajikan data realistis di URL langsung, sehingga semua orang membangun berdasarkan kontrak yang sama sebelum backend siap. Unduh Apidog dan ubah spesifikasi OpenAPI Anda menjadi mock yang berfungsi dalam hitungan menit.
