Saya mengalami masalah saat membuat Chai expect.to.throw
bekerja dalam pengujian untuk aplikasi node.js saya. Tes terus gagal pada kesalahan yang dilemparkan, tetapi Jika saya membungkus test case dalam mencoba dan menangkap dan menegaskan kesalahan yang tertangkap, itu berfungsi.
Tidak expect.to.throw
berfungsi seperti yang saya pikir seharusnya atau sesuatu?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
Kesalahan:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
sumber
model
Misalnya memiliki fungsi yang disebut get yang saya lewati / panggil di harapkan.to.throw
adalah menguji kondisi tertentu dalam suatu fungsi, yang mengharuskan pemanggilan fungsi tersebut dengan keadaan / argumen yang tidak valid. (Dalam hal ini .... mengapa tidak deeplink chaijs.com sebenarnya deeplink?)Seperti yang dikatakan jawaban ini , Anda juga bisa membungkus kode Anda dalam fungsi anonim seperti ini:
sumber
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
Karena tidak ada metode pemberitahuan.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
fungsi yang akan dipanggil. Lalu.bind
adalah cara yang tepat untuk pergi.Dan jika Anda sudah menggunakan ES6 / ES2015 maka Anda juga dapat menggunakan fungsi panah. Pada dasarnya sama dengan menggunakan fungsi anonim normal tetapi lebih pendek.
sumber
this
this
dari ruang lingkup tempat mereka dibuat. Sering kali ini bisa menjadi keuntungan, karena menghindari kebutuhan untuk memasukkanbind
fungsi kethis
objek mereka secara manual.bind
dan selalu terikatthis
pada lingkup induknya. Niat saya dalam komentar itu hanya untuk memastikan pembaca menyadari potensi jatuhan.Pertanyaan ini memiliki banyak, banyak duplikat, termasuk pertanyaan yang tidak menyebutkan perpustakaan pernyataan Chai. Berikut adalah dasar-dasar yang dikumpulkan bersama:
Pernyataan harus memanggil fungsi, alih-alih segera mengevaluasi.
Anda dapat memeriksa kesalahan tertentu menggunakan pustaka pernyataan apa saja:
Node
Sebaiknya
Chai Harapkan
Anda harus menangani pengecualian yang 'lolos' dari ujian
Ini bisa terlihat membingungkan pada awalnya. Seperti mengendarai sepeda, itu hanya 'klik' selamanya setelah diklik.
sumber
contoh dari doc ...;)
karena Anda mengandalkan
this
konteks:Anda harus menggunakan salah satu opsi ini:
ikat konteksnya
sumber
Satu implementasi lain yang mungkin, lebih rumit daripada solusi .bind (), tetapi yang membantu untuk membuat titik yang diharapkan () membutuhkan fungsi yang menyediakan
this
konteks ke fungsi yang dicakup, Anda dapat menggunakancall()
, misalnya,expect(function() {model.get.call(model, 'z');}).to.throw('...');
sumber
Saya telah menemukan cara yang bagus di sekitarnya:
Ini jauh lebih mudah dibaca daripada versi lama saya:
sumber