Materi
Handler sungguhan bergantung pada hal di luar dirinya: repositori yang menyimpan data, jam, dan pembuat nomor. Bila handler memakai semuanya langsung dari variabel global, tes tidak bisa mengendalikannya; Date.now() memberi angka berbeda setiap saat. Jalan keluarnya: berikan ketergantungan sebagai argumen fungsi pembuat, misalnya buatApp({ repo, jam }). Di produksi yang diberikan repositori basis data dan Date.now; di tes, tiruan.
Panduan Mocking in tests di nodejs.org menggolongkan kandidat tiruan menjadi kode sendiri, kode luar, dan sistem luar seperti basis data dan penyimpanan memori, lalu menunjukkan waktu sebagai hal yang bisa dikendalikan. Istilah test double sudah dibahas di kelas Pengujian Perangkat Lunak. Di sini dipakai dua: fake, repositori di memori yang benar-benar bekerja, dan spy, fungsi pembungkus yang mencatat setiap panggilan. node:test menyediakan spy lewat mock.fn; setiap catatan di mock.calls memuat arguments, result, dan error.
import { mock, test } from "node:test";
import assert from "node:assert/strict";
test("reservasi tidak sah tidak ditulis", () => {
const tambah = mock.fn((data) => ({ id: 1, ...data }));
const app = buatApp({ repo: { tambah }, jam: () => 1767225600000 });
app(buatReq({ method: "POST", path: "/reservasi", data: { tamu: 0 } }));
assert.equal(tambah.mock.callCount(), 0);
});Spy menjawab pertanyaan yang tidak terlihat dari respons: apakah repositori ditulis, berapa kali, dan dengan data apa. Middleware diuji dengan cara serupa: berikan next tiruan yang mencatat request yang diterimanya, lalu periksa apakah next dipanggil dan dengan req seperti apa.