Rumah > Artikel > hujung hadapan web > Mengapa Penegasan Mocha/Chai Saya `menjangka.membuang` Gagal Mendapat Ralat yang Dilemparkan?
Mocha/Chai expect.to.throw Puzzle: Catching Thrown Errors
Chai expect.to.throw Penegasan nampaknya sukar difahami dalam menangkap kesilapan yang dilemparkan dengan betul. Walaupun menulis kes ujian, dakwaan dengan expect.to.throw berulang kali gagal.
Untuk menjelaskan, mari kita pertimbangkan coretan kod berikut:
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); 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.')); });
Nampaknya, intipati Isu terletak pada cara kita menyampaikan ungkapan yang diharapkan.untuk.buang.
Penyelesaian: Membungkus Fungsi
Untuk membetulkan masalah ini, kita perlu lulus fungsi untuk expect.to.throw, yang kemudiannya akan digunakan. Kod pelarasan berikut kini akan berfungsi seperti yang dimaksudkan:
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); expect(model.get.bind(model, 'z')).to.throw('Property does not exist in model schema.'); expect(model.get.bind(model, 'z')).to.throw(new Error('Property does not exist in model schema.')); });
Dengan menggunakan kaedah bind, kami mencipta fungsi baharu yang, apabila dipanggil, akan membangkitkan model.get dengan set ini kepada model dan set hujah awal kepada 'z'.
Penjelasan Pengikatan
Dalam konteks ini, bind memainkan peranan yang penting. Ia menjana fungsi baharu yang menerima hujah yang sama seperti yang asal tetapi dengan nilai khusus untuk ini apabila dipanggil. Dalam kes kita, nilai ini ialah model dan hujahnya ialah 'z'.
Apabila kita lulus hasil model.get('z') to expect.to.throw, kita pada dasarnya melepasi yang dilemparkan kesilapan terhadap penegasan. Walau bagaimanapun, tujuan expect.to.throw adalah untuk menyemak sama ada pengecualian dilemparkan oleh fungsi tertentu apabila dipanggil. Oleh itu, kita mesti lulus fungsi itu sendiri dan bukannya hasilnya. Kaedah bind membolehkan kami melakukan perkara itu.
Untuk menyelam lebih mendalam, rujuk pautan yang disediakan.
Atas ialah kandungan terperinci Mengapa Penegasan Mocha/Chai Saya `menjangka.membuang` Gagal Mendapat Ralat yang Dilemparkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!