Kuasai penggunaan blok chai test.catch() yang betul
P粉242535777
2023-09-02 12:25:27
<p>Saya cuba mencapai liputan yang baik dengan ujian hujung ke hujung pangkalan kod saya, jadi saya mahu menguji kod <kod>.catch()</code> </p><p>
API saya menggunakan node.js dan mongoose. </p><p>
Saya menggunakan chai dan mocha untuk ujian.</p>
<p>Saya mencuba sesuatu seperti: </p>
<p><em>Fail src/controllers/user.controller.js:</em></p>
<pre class="brush:php;toolbar:false;">const Pengguna = memerlukan("../models/user.model");
const getUser = async(req, res) =>
cuba {
const user = tunggu User.findOne({name: req.name});
return res.status(200).json(user);
} tangkap (err) {
//Ini adalah kod yang saya ingin uji
console.error(`Ralat mencari pengguna ${req.name}:`, err);
kembalikan res.status(err.code).json({mesej: err });
}
}</pre>
<p><em>Fail src/models/user.model.js:</em></p>
<pre class="brush:php;toolbar:false;">const mongoose = require("mongoose");
const UserSchema = mongoose.Schema({
nama: {
jenis: rentetan,
diperlukan: "Nama diperlukan",
},
});
module.exports = mongoose.model("Pengguna", UserSchema);</pre>
<p><em>Ujian fail/user.test.js:</em></p>
<pre class="brush:php;toolbar:false;">const chai = memerlukan("chai");
const chaiHttp = memerlukan("chai-http");
const spies = memerlukan("chai-spies");
const Pengguna = memerlukan("../src/models/user.model");
chai.use(chaiHttp);
chai.use(mata-mata);
chai.should();
huraikan("ralat mongoose harus ditangani", function() {
huraikan("Kaedah Pengguna Bermasalah.findOne", fungsi() {
const _User_findOne_Backup = Pengguna.findOne;
beforeEach(fungsi() {
// Fungsi ini harus mengatasi fungsi findOne sebenar, tetapi ia tidak berjaya!User.findOne = function() {
return Promise.reject("Kesilapan paksa");
};
});
afterEach(function() { //Pulihkan fungsi sebenar selepas setiap ujian
User.findOne = _User_findOne_Backup;
});
it("Pendaftaran harus mengembalikan ralat pelayan", function() {
const spy = chai.spy();
pulangkan chai
.request(server)
.post("/api/getUser")
.hantar({nama: "Alice"})
.then(spy)
.catch((err) => {
const res = err.response;
res.should.have.status(500);
})
.then(() => {
spy.should.not.have.been.called();
})
;
});
});
});</pre>
<p>Masalahnya ialah dalam ujian saya, kaedah <code>User.findOne()</code> tidak pernah dipanggil: kaedah <code>findOne</code> jadi kaedah <code>getUser</code> tidak pernah membuang pengecualian, menyebabkan ujian saya gagal...</p>
<p>Mungkin saya kehilangan sesuatu yang jelas, tetapi saya benar-benar tidak dapat menemuinya... :-(</p><p>
Jika lebih banyak kod atau konteks diperlukan, sila beritahu saya...</p>
<p><strong>Kemas kini: </strong>
Mengikuti cadangan @Bergi, saya menambah maklumat lengkap tentang model (dipermudahkan) saya dan modul yang diperlukan...</p>
Berfungsi hebat untuk saya.
Contohnya:
user.model.js
:user.controller.js
:server.js
:user.test.js
:Keputusan ujian:
Versi pakej: