Materi
JavaScript tidak punya pernyataan assert, tetapi bentuk test-nya sama: panggil fungsi, bandingkan dengan hasil harapan, laporkan bila berbeda. Pelaksana test bawaan Node.js, node:test, memakai aturan sederhana untuk test sinkron: fungsi test dianggap gagal bila ia melempar exception, dan lulus bila tidak. Aturan itu bisa dipakai tanpa pustaka apa pun. Test adalah fungsi yang menjalankan throw new Error(...) ketika hasilnya menyimpang.
function samaDengan(dapat, harap, label) {
if (JSON.stringify(dapat) !== JSON.stringify(harap)) {
throw new Error(label + ": dapat " + JSON.stringify(dapat) + ", harap " + JSON.stringify(harap));
}
}
function ujiLuas(luas) {
samaDengan(luas(4, 5), 20, "ruang 4 x 5");
samaDengan(luas(3, 0), 0, "lebar nol");
}
ujiLuas((p, l) => p * l); // diam: lulus
Untuk angka dan teks, === membandingkan nilai. Untuk larik dan objek, === membandingkan identitas: [1, 2] === [1, 2] bernilai false, karena keduanya dua objek berbeda walaupun isinya sama. Itu sebabnya helper di atas membandingkan hasil JSON.stringify, yang mengubah isi larik menjadi teks. Cara itu cukup untuk angka, teks, larik, dan objek sederhana, dengan dua catatan: objek yang sama isinya tetapi berbeda urutan kuncinya dianggap tidak sama, dan undefined di dalam larik berubah menjadi null.
Fungsi yang harus melempar galat diuji dengan arah terbalik: panggil di dalam try, catat bila exception muncul, dan lempar galat sendiri bila tidak muncul.
function ujiAkar(akar) {
samaDengan(akar(9), 3, "akar 9");
let melempar = false;
try {
akar(-1);
} catch (e) {
melempar = true;
}
if (!melempar) throw new Error("akar(-1) harus melempar galat");
}
console.assert(kondisi, pesan) tampak seperti assert, tetapi MDN menjelaskan perilakunya: bila kondisinya salah, pesan galat ditulis ke konsol; bila benar, tidak terjadi apa-apa. Program tidak berhenti dan tidak ada exception, sehingga pelaksana test tidak tahu ada yang gagal. Di proyek Node.js, node:assert menyediakan assert.strictEqual, assert.deepStrictEqual untuk larik dan objek, dan assert.throws; node:test mengelompokkan test dan menjalankannya dengan perintah node --test.