Beherrschen Sie die korrekte Verwendung des chai test.catch()-Blocks
P粉242535777
2023-09-02 12:25:27
<p>Ich versuche eine gute Abdeckung durch End-to-End-Tests meiner Codebasis zu erreichen, daher möchte ich auch den <code>.catch()</code>-Code testen. </p><p>
Meine API verwendet node.js und mongoose. </p><p>
Zum Testen verwende ich Chai und Mokka.</p>
<p>Ich habe etwas versucht wie: </p>
<p><em>Datei src/controllers/user.controller.js:</em></p>
<pre class="brush:php;toolbar:false;">const User = require("../models/user.model");
const getUser = async(req, res) =>
versuchen {
const user = waiting User.findOne({name: req.name});
return res.status(200).json(user);
} Catch (Err) {
//Dies ist der Code, den ich testen möchte
console.error(`Fehler beim Finden des Benutzers ${req.name}:`, err);
return res.status(err.code).json({ message: err });
}
}</pre>
<p><em>Datei src/models/user.model.js:</em></p>
<pre class="brush:php;toolbar:false;">const mongoose = require("mongoose");
const UserSchema = mongoose.Schema({
Name: {
Typ: Zeichenfolge,
erforderlich: "Name ist erforderlich",
},
});
module.exports = mongoose.model("Benutzer", UserSchema);</pre>
<p><em>Datei test/user.test.js:</em></p>
<pre class="brush:php;toolbar:false;">const chai = require("chai");
const chaiHttp = require("chai-http");
const spies = require("chai-spies");
const User = require("../src/models/user.model");
chai.use(chaiHttp);
chai.use(Spione);
chai.should();
beschreiben("Mongoose-Fehler sollten behandelt werden", function() {
beschreiben("Problematische User.findOne-Methode", function() {
const _User_findOne_Backup = User.findOne;
beforeEach(function() {
// Diese Funktion sollte die echte findOne-Funktion überladen, aber es war nicht erfolgreich!User.findOne = function() {
return Promise.reject("Erzwungener Fehler");
};
});
afterEach(function() { //Stellen Sie die echte Funktion nach jedem Test wieder her
User.findOne = _User_findOne_Backup;
});
it("Die Registrierung sollte einen Serverfehler zurückgeben", function() {
const spy = chai.spy();
Chai zurückgeben
.request(server)
.post("/api/getUser")
.send({Name: "Alice"})
.dann(Spion)
.catch((err) => {
const res = err.response;
res.should.have.status(500);
})
.then(() => {
spy.should.not.haven.called();
})
;
});
});
});</pre>
<p>Das Problem ist, dass in meinen Tests die gefälschte Methode <code>User.findOne()</code> nie aufgerufen wird: Die ursprüngliche mongoose-Methode <code>findOne</code> Daher löst die Methode <code>getUser</code> nie eine Ausnahme aus, was dazu führt, dass mein Test fehlschlägt...</p>
<p>Vielleicht übersehe ich etwas Offensichtliches, aber ich kann es wirklich nicht finden ... :-(</p><p>
Wenn Sie mehr Code oder Kontext benötigen, lassen Sie es mich bitte wissen...</p>
<p><strong>Update: </strong>
Dem Vorschlag von @Bergi folgend, habe ich vollständige Informationen zu meinem (vereinfachten) Modell und den erforderlichen Modulen hinzugefügt...</p>
对我来说很好用。
例如:
user.model.js
:user.controller.js
:server.js
:user.test.js
:测试结果:
软件包版本: