Saya mencoba menulis tes untuk Jasmine Test Framework yang mengharapkan kesalahan. Saat ini saya menggunakan integrasi Jasmine Node.js dari GitHub .
Dalam modul Node saya, saya memiliki kode berikut:
throw new Error("Parsing is not possible");
Sekarang saya mencoba menulis tes yang mengharapkan kesalahan ini:
describe('my suite...', function() {
[..]
it('should not parse foo', function() {
[..]
expect(parser.parse(raw)).toThrow(new Error("Parsing is not possible"));
});
});
Saya juga mencoba Error()
dan beberapa varian lainnya dan tidak tahu cara membuatnya bekerja.
javascript
testing
node.js
jasmine
echox
sumber
sumber
Function.bind
: stackoverflow.com/a/13233194/294855Jawaban:
Anda harus menyampaikan fungsi ke dalam
expect(...)
panggilan. Kode yang Anda miliki di sini:sedang mencoba untuk benar-benar memanggil
parser.parse(raw)
upaya untuk meneruskan hasilnyaexpect(...)
,Coba gunakan fungsi anonim:
sumber
expect(parser.parse).toThrow(...)
expect(blah).toThrow()
. Tidak ada argumen yang berarti memeriksa untuk melihat apakah ia melempar sama sekali Tidak diperlukan pencocokan string. Lihat juga: stackoverflow.com/a/9525172/1804678parser.parse
digunakanthis
, melewatinya tanpa konteks akan menghasilkan hasil yang tidak terduga. Anda bisa lulusparser.parse.bind(parser)
, tapi jujur ... fungsi anonim akan lebih elegan.Anda menggunakan:
Tetapi jika Anda akan melihat komentar fungsi (yang diharapkan adalah string):
Saya kira Anda mungkin harus menulis seperti ini (menggunakan lambda - fungsi anonim):
Ini dikonfirmasi dalam contoh berikut:
Douglas Crockford sangat merekomendasikan pendekatan ini, daripada menggunakan "throw new Error ()" (cara prototyping):
sumber
Error
( jsfiddle.net/k1mxey8j ). Namun, objek yang Anda lempar tentu saja tidak akan memiliki.stack
properti, yang mungkin penting jika Anda ingin mengatur pelaporan kesalahan otomatis .Solusi yang lebih elegan daripada membuat fungsi anonim yang tujuan utamanya adalah untuk membungkus yang lain, adalah menggunakan
bind
fungsi es5 . Fungsi bind menciptakan fungsi baru yang, ketika dipanggil, memilikithis
kata kunci yang disetel ke nilai yang disediakan, dengan urutan argumen tertentu sebelum yang disediakan ketika fungsi baru dipanggil.Dari pada:
expect(function () { parser.parse(raw, config); } ).toThrow("Parsing is not possible");
Mempertimbangkan:
expect(parser.parse.bind(parser, raw, config)).toThrow("Parsing is not possible");
Sintaks mengikat memungkinkan Anda untuk menguji fungsi dengan
this
nilai yang berbeda , dan menurut saya membuat tes lebih mudah dibaca. Lihat juga: https://stackoverflow.com/a/13233194/1248889sumber
Saya mengganti korek api toThrow Jasmine dengan yang berikut, yang memungkinkan Anda mencocokkan pada properti nama pengecualian atau properti pesannya. Bagi saya ini membuat tes lebih mudah untuk ditulis dan kurang rapuh, karena saya dapat melakukan hal berikut:
dan kemudian uji dengan yang berikut ini:
Ini memungkinkan saya mengubah pesan pengecualian nanti tanpa melanggar tes, ketika yang penting adalah bahwa itu melemparkan jenis pengecualian yang diharapkan.
Ini adalah pengganti toThrow yang memungkinkan ini:
sumber
expect(blah).toThrow()
. Tidak ada argumen yang berarti memeriksa untuk melihat apakah ia melempar sama sekali Tidak diperlukan pencocokan string. Lihat juga: stackoverflow.com/a/9525172/1804678Seperti yang disebutkan sebelumnya, fungsi harus dilewatkan
toThrow
karena fungsi yang Anda jelaskan dalam pengujian Anda: "Saya berharap fungsi ini untuk membuang x"Jika menggunakan Jasmine-Matchers Anda juga dapat menggunakan salah satu dari berikut ini ketika mereka sesuai dengan situasi;
atau
sumber
expect(foo).toThrowError(TypeError);
dalam Jasmine 2.5: jasmine.github.io/2.5/introductionSaya tahu ini lebih banyak kode tetapi Anda juga dapat melakukannya:
sumber
Untuk pecinta kopi
sumber
Bagi siapa pun yang mungkin masih menghadapi masalah ini, bagi saya solusi yang diposting tidak bekerja dan terus melempar kesalahan ini:
Error: Expected function to throw an exception.
Saya kemudian menyadari bahwa fungsi yang saya harapkan untuk melakukan kesalahan adalah fungsi async dan mengharapkan janji untuk ditolak dan kemudian buang kesalahan dan itulah yang saya lakukan dalam kode saya:dan itulah yang saya lakukan dalam pengujian dan berhasil:
sumber
expectAsync
jasmine.github.io/api/3.3/async-matchers.html