Ich versuche eine gute Abdeckung durch End-to-End-Tests meiner Codebasis zu erreichen, daher möchte ich auch den .catch()
-Code testen.
Meine API verwendet node.js und mongoose.
Zum Testen verwende ich Chai und Mokka.
Ich habe etwas versucht wie:
Datei src/controllers/user.controller.js:
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 }); } }
Datei src/models/user.model.js:
const mongoose = require("mongoose"); const UserSchema = mongoose.Schema({ Name: { Typ: Zeichenfolge, erforderlich: "Name ist erforderlich", }, }); module.exports = mongoose.model("Benutzer", UserSchema);
Datei test/user.test.js:
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(); }) ; }); }); });
Das Problem ist, dass in meinen Tests die gefälschte Methode User.findOne()
nie aufgerufen wird: Die ursprüngliche mongoose-Methode findOne
Daher löst die Methode getUser
nie eine Ausnahme aus, was dazu führt, dass mein Test fehlschlägt...
Vielleicht übersehe ich etwas Offensichtliches, aber ich kann es wirklich nicht finden ... :-(
Wenn Sie mehr Code oder Kontext benötigen, lassen Sie es mich bitte wissen...
Update: Dem Vorschlag von @Bergi folgend, habe ich vollständige Informationen zu meinem (vereinfachten) Modell und den erforderlichen Modulen hinzugefügt...
对我来说很好用。
例如:
user.model.js
:user.controller.js
:server.js
:user.test.js
:测试结果:
软件包版本: