Apa itu "menegaskan" dalam JavaScript?

263

Apa assertartinya dalam JavaScript?

Saya telah melihat sesuatu seperti:

assert(function1() && function2() && function3(), "some text");

Dan ingin tahu apa metode assert()ini.

frrlod
sumber

Jawaban:

367

Tidak ada assertdalam JavaScript (belum; ada pembicaraan tentang menambahkan satu , tapi ini pada tahap awal). Mungkin Anda menggunakan beberapa perpustakaan yang menyediakannya. Arti yang biasa adalah melempar kesalahan jika ekspresi yang dilewatkan ke fungsi salah; ini adalah bagian dari konsep umum pengecekan asersi . Biasanya pernyataan (sebagaimana mereka disebut) digunakan hanya dalam membangun "pengujian" atau "debug" dan dihapus dari kode produksi.

Misalkan Anda memiliki fungsi yang seharusnya selalu menerima string. Anda ingin tahu apakah seseorang memanggil fungsi itu dengan sesuatu yang bukan string. Jadi, Anda mungkin melakukannya:

assert(typeof argumentName === "string");

... di mana assertakan melempar kesalahan jika kondisinya salah.

Versi yang sangat sederhana akan terlihat seperti ini:

function assert(condition, message) {
    if (!condition) {
        throw message || "Assertion failed";
    }
}

Lebih baik lagi, gunakan Errorobjek jika mesin JavaScript mendukungnya (yang benar-benar tua mungkin tidak), yang memiliki keuntungan mengumpulkan jejak tumpukan dan semacamnya:

function assert(condition, message) {
    if (!condition) {
        message = message || "Assertion failed";
        if (typeof Error !== "undefined") {
            throw new Error(message);
        }
        throw message; // Fallback
    }
}

Bahkan IE8 memiliki Error(walaupun tidak memiliki stackproperti, tetapi mesin modern [termasuk IE modern] memilikinya).

TJ Crowder
sumber
6
... mendapatkan semangat tentang jenis-jenis di JS? Saya berpendapat itu salah satu alasan terburuk assert.
cHao
137
@ cHao: Ada kasus penggunaan yang valid. Itu hanya contoh pertama yang muncul di benak saya. Contohnya bukan itu intinya. Konsep asersi adalah intinya.
TJ Crowder
4
sesuatu yang saya ditambahkan ke kode saya di dalam if(!condition)adalah pengaturan var throwError=true;maka debugger;kemudian bungkus bagian lemparan dalam if(throwError). Dengan begitu, jika saya memiliki debugger terbuka, itu akan rusak, dan jika saya ingin saya dapat mengatur throwErrorke false dan kemudian memeriksa semua cakupan sambil melangkah keluar.
Rick
8
@Rick jika Anda menggunakan Chrome DevTools, Anda cukup mengaktifkan "Jeda Pengecualian yang Tidak Berhasil" di tab Sumber dan itu akan otomatis rusak di throw. Dengan begitu Anda tidak perlu debugger;pernyataan itu. Lihat developer.chrome.com/devtools/docs/… untuk lebih lanjut.
Vicky Chijwani
1
@machineghost: Saya tidak melihat bagaimana itu "lebih sederhana," Anda baru saja berdagang ifdengan operator bersyarat. Bagaimanapun, di dunia saat ini, saya tidak akan repot-repot mendukung mesin yang tidak memiliki Error.
TJ Crowder
157

Jika menggunakan browser modern atau nodejs, Anda dapat menggunakan console.assert(expression, object).

Untuk informasi lebih lanjut:

Jooprib
sumber
46
FYI, ini bertindak lebih seperti console.errorkode terus dieksekusi.
Daniel Sokolowski
10
@DanielSokolowski, Tepat. console.asserttidak begitu baik kecuali jika ia memiliki perilaku yang sama throw.
Pacerier
23
Alasan eksekusi berlanjut setelah console.assertini adalah karena pernyataan bukan fungsi penanganan kesalahan. Mereka dirancang untuk memeriksa kebenaran kode selama pengembangan saja. Secara tradisional mereka benar-benar dinonaktifkan di lingkungan produksi untuk menghindari pemutusan sistem hidup karena sesuatu yang sepele. Browser dianggap sebagai lingkungan produksi, jadi console.asserttidak menghentikan eksekusi di sana. Jika Anda mengandalkan pernyataan untuk menghentikan eksekusi, maka Anda harus menggunakan penanganan kesalahan yang tepat, karena ini bukan tujuan pernyataan.
Malvineous
8
@RonBurk: Desainer bahasa memutuskan "pernyataan apa yang dimaksudkan untuk". Dalam C ++ [pernyataan] dirancang untuk menangkap kesalahan pemrograman, bukan kesalahan pengguna atau run-time, karena umumnya dinonaktifkan setelah program keluar dari fase debuggingnya. PHP mengatakan Sebagai aturan praktis kode Anda harus selalu dapat berfungsi dengan benar jika pemeriksaan pernyataan tidak diaktifkan. Suara pasif tidak dimaksudkan untuk memberikan otoritas pada preferensi pribadi, tetapi untuk melaporkan apa yang diterima secara umum.
Malvineous
4
@ Don: Titik diambil tetapi saya baru saja mengutip dari halaman yang tertaut. Saya percaya pernyataan harus diperlakukan seolah-olah dapat dinonaktifkan, jika hanya karena kode Anda suatu hari nanti dapat digunakan oleh seseorang yang berpikir itu aman untuk dilakukan. Jika pernyataan sangat penting untuk kode Anda, maka saya pikir mereka benar-benar harus ditingkatkan untuk pemeriksaan kesalahan yang tepat daripada mengandalkan metode debugging yang tidak selalu dijamin untuk mengakhiri eksekusi. Belum lagi bahwa kode Anda berulang kali mati di lingkungan produksi ketika kode tersebut hanya dapat mengembalikan kesalahan dan melanjutkan dapat menyebabkan lebih banyak stres daripada nilainya!
Malvine
29

Jawaban lainnya bagus: tidak ada fungsi tegas yang dibangun ke dalam ECMAScript5 (mis. JavaScript yang pada dasarnya berfungsi di mana-mana), tetapi beberapa browser memberikannya kepada Anda atau memiliki pengaya yang menyediakan fungsionalitas itu. Meskipun mungkin lebih baik menggunakan perpustakaan yang mapan / populer / dikelola untuk ini, untuk tujuan akademik fungsi "orang miskin menegaskan" mungkin terlihat seperti ini:

const assert = function(condition, message) {
    if (!condition)
        throw Error('Assert failed: ' + (message || ''));
};

assert(1 === 1); // Executes without problem
assert(false, 'Expected true');
// Yields 'Error: Assert failed: Expected true' in console
iX3
sumber
BTW, seseorang dapat dengan mudah memodifikasi ini sehingga hanya melemparkan kesalahan dalam lingkungan pengembangan (misalnya dengan membungkus yang lain jika / menambahkan persyaratan lain) dan jika tidak melakukan apa-apa atau hanya mencetak peringatan. Secara pribadi, pendapat saya adalah bahwa pernyataan hanya boleh dalam kode uji (mis. Memeriksa apakah hasil yang diharapkan & aktual cocok); dalam kode produksi mereka baik harus berlebihan (dijamin benar dengan desain) dan dengan demikian dihapus atau hanya untuk menjaga user / input eksternal dalam hal ini mereka dapat digantikan oleh sanitasi logika & standar penanganan eksepsi (misalnya try, catch, throw)
iX3
8

assert()bukan fungsi javascript asli. Ini adalah fungsi khusus yang dibuat seseorang. Anda harus mencarinya di halaman Anda atau di file Anda dan mempostingnya untuk siapa saja untuk membantu menentukan apa yang dilakukannya.

Crayon Violent
sumber
5

Periksa ini: http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-quick-and-easy-javascript-testing-with-assert/

itu untuk menguji JavaScript. Hebatnya, pada hampir lima atau enam baris, kode ini memberikan tingkat kekuatan dan kontrol yang besar terhadap kode Anda, saat pengujian.

Fungsi penegasan menerima dua parameter:

hasil: Boolean, yang merujuk apakah tes Anda lulus atau gagal

description: Deskripsi singkat dari tes Anda.

Fungsi assert kemudian hanya membuat item daftar, menerapkan kelas "lulus" atau "gagal," tergantung pada apakah tes Anda kembali benar atau salah, dan kemudian menambahkan deskripsi ke item daftar. Akhirnya, blok kode itu ditambahkan ke halaman. Ini gila sederhana, tetapi bekerja dengan sempurna.

Amrendra
sumber
4

Berikut ini adalah implementasi fungsi penegasan yang sangat sederhana. Dibutuhkan nilai dan deskripsi tentang apa yang Anda uji.

 function assert(value, description) {
        var result = value ? "pass" : "fail";
        console.log(result + ' - ' +  description); 
    };

Jika nilai bernilai true, nilai itu lewat.

assert (1===1, 'testing if 1=1');  

Jika kembali salah, gagal.

assert (1===2, 'testing if 1=1');
joshpierro
sumber
1
Tujuan pernyataan tidak untuk login ke stdout di tingkat info, tetapi untuk menghentikan pelaksanaan program (biasanya menaikkan pengecualian) dan untuk masuk ke stderr jika pernyataan dievaluasi dengan false.
Nuno André
4

Jika pernyataan salah, pesan ditampilkan. Khususnya, jika argumen pertama salah, argumen kedua (pesan string) akan dicatat di konsol alat pengembang. Jika argumen pertama benar, pada dasarnya tidak ada yang terjadi. Contoh sederhana - Saya menggunakan Alat Pengembang Google:

var isTrue = true;
var isFalse = false;
console.assert(isTrue, 'Equals true so will NOT log to the console.');
console.assert(isFalse, 'Equals false so WILL log to the console.');
Kucing gila
sumber
3

Mungkin datang dengan pustaka pengujian yang menggunakan beberapa kode Anda. Berikut ini contohnya (kemungkinan bukan pustaka yang sama dengan kode Anda, tetapi ini menunjukkan ide umum):

http://chaijs.com/guide/styles/#assert

Matt Browne
sumber
2

Kata atau fungsi "menegaskan" sebagian besar digunakan dalam pengujian bagian aplikasi.

Fungsi penegasan adalah cara singkat untuk menginstruksikan program untuk memeriksa kondisi (juga disebut "pernyataan") dan jika kondisinya tidak Benar, itu akan menimbulkan kesalahan.

Jadi mari kita lihat bagaimana tampilannya dalam "kode normal"

if (typeof "string" === "array") { throw Error('Error: "string" !== "array"'); }

Dengan assertAnda cukup menulis:

assert(typeof "string" === "array")

Di Javascript, tidak ada yang asli assert fungsi , jadi Anda harus menggunakan satu dari beberapa perpustakaan.

Untuk pengantar sederhana, Anda dapat memeriksa artikel ini:

http://fredkschott.com/post/2014/05/nodejs-testing-essentials/

Saya harap ini membantu.

Pavel
sumber
2

Penegasan melempar pesan kesalahan jika atribut pertama salah, dan atribut kedua adalah pesan yang akan dibuang.

console.assert(condition,message);

Ada banyak komentar yang mengatakan pernyataan tidak ada dalam JavaScript tetapi console.assert()fungsi penegasan dalam JavaScript Gagasan penegasan adalah untuk menemukan mengapa / di mana bug terjadi.

console.assert(document.getElementById("title"), "You have no element with ID 'title'");
console.assert(document.getElementById("image"), "You have no element with ID 'image'");

Di sini tergantung pada pesan Anda dapat menemukan apa bug itu. Pesan-pesan kesalahan ini akan ditampilkan ke konsol dalam warna merah seolah-olah kita dipanggil console.error();
untuk melihat lebih banyak fungsi di konsol mengeksekusiconsole.log(console);

Rahul
sumber
1

Jawaban sebelumnya dapat ditingkatkan dalam hal kinerja dan kompatibilitas.

Periksa sekali apakah Errorobjek itu ada, jika tidak menyatakannya:

if (typeof Error === "undefined") {
    Error = function(message) {
        this.message = message;
    };
    Error.prototype.message = "";
}

Kemudian, setiap pernyataan akan memeriksa kondisi, dan selalu melempar Errorobjek

function assert(condition, message) {
    if (!condition) throw new Error(message || "Assertion failed");
}

Perlu diingat bahwa konsol tidak akan menampilkan nomor baris kesalahan nyata, tetapi baris assertfungsi, yang tidak berguna untuk debugging.

Karl.S
sumber
1

Jika Anda menggunakan Webpack, Anda hanya dapat menggunakan perpustakaan pernyataan node.js . Meskipun mereka mengklaim bahwa itu "tidak dimaksudkan untuk menjadi perpustakaan pernyataan tujuan umum", tampaknya lebih dari OK untuk pernyataan sementara, dan tampaknya tidak ada pesaing di ruang Node (Chai dirancang untuk pengujian unit).

const assert = require('assert');
...
assert(jqXHR.status == 201, "create response should be 201");

Anda perlu menggunakan webpack atau browserify untuk dapat menggunakan ini, jadi jelas ini hanya berguna jika sudah ada dalam alur kerja Anda.

amoe
sumber
1

Selain opsi lain seperti console.assert atau bergulir sendiri , Anda dapat menggunakan invarian . Ini memiliki beberapa fitur unik:

  • Ini mendukung pesan kesalahan yang diformat (menggunakan %sspecifier).
  • Dalam lingkungan produksi (sebagaimana ditentukan oleh lingkungan Node.js atau Webpack), pesan kesalahan adalah opsional, memungkinkan untuk (sedikit) .js lebih kecil.
Josh Kelley
sumber
0

Seperti yang disebutkan oleh TJ, Tidak ada assertdalam JavaScript. Namun, ada modul simpul bernama assert , yang digunakan sebagian besar untuk pengujian . jadi, Anda mungkin melihat kode seperti:

const assert = require('assert');
assert(5 > 7);
yuval.bl
sumber