Maîtriser l'utilisation correcte du bloc chai test.catch()
P粉242535777
P粉242535777 2023-09-02 12:25:27
0
1
566
<p>J'essaie d'obtenir une bonne couverture avec des tests de bout en bout de ma base de code, je souhaite donc également tester le code <code>.catch()</code> </p><p> Mon API utilise node.js et mangouste. </p><p> J'utilise du chai et du moka pour les tests.</p> <p>J'ai essayé quelque chose comme : </p> <p><em>Fichier src/controllers/user.controller.js :</em></p> <pre class="brush:php;toolbar:false;">const User = require("../models/user.model"); const getUser = async(req, res) => essayer { const user = wait User.findOne({name: req.name}); return res.status(200).json(utilisateur); } attraper (erreur) { //C'est le code que je veux tester console.error(`Erreur lors de la recherche de l'utilisateur ${req.name}:`, err); return res.status(err.code).json({ message : err }); } }</pré> <p><em>Fichier src/models/user.model.js :</em></p> <pre class="brush:php;toolbar:false;">const mangouste = require("mangouste"); const UserSchema = mangouste.Schema({ nom: { tapez : chaîne, requis : "Le nom est requis", }, }); module.exports = mongoose.model("Utilisateur", UserSchema);</pre> <p><em>Fichier test/user.test.js :</em></p> <pre class="brush:php;toolbar:false;">const chai = require("chai"); const chaiHttp = require("chai-http"); const espions = require("chai-spies"); const User = require("../src/models/user.model"); chai.use(chaiHttp); chai.use(espions); chai.should(); décrire("les erreurs de mangouste doivent être gérées", function() { décrire("Méthode problématique User.findOne", fonction() { const _User_findOne_Backup = User.findOne; avantEach(fonction() { // Cette fonction aurait dû surcharger la vraie fonction findOne, mais elle n'a pas réussi !Utilisateur.findOne = fonction() { return Promise.reject("Erreur forcée"); } ; }); afterEach(function() { //Restaurer la vraie fonction après chaque test User.findOne = _User_findOne_Backup ; }); it("L'inscription devrait renvoyer une erreur de serveur", function() { const espion = chai.spy(); retour chai .request(serveur) .post("/api/getUser") .send({nom : "Alice"}) .puis (espion) .catch((erreur) => { const res = err.response; res.devrait.avoir.le statut(500); }) .then(() => { spy.ne.aurait.pas.été.appelé(); }) ; }); }); });</pré> <p>Le problème est que dans mes tests, la fausse méthode <code>User.findOne()</code> n'est jamais appelée : la méthode originale mangouste <code>findOne</code> donc la méthode <code>getUser</code> ne lève jamais d'exception, ce qui entraîne l'échec de mon test...</p> <p>Peut-être qu'il me manque quelque chose d'évident, mais je ne parviens vraiment pas à le trouver... :-(</p><p> Si vous avez besoin de plus de code ou de contexte, faites-le moi savoir...</p> <p><strong>Mise à jour : </strong> Suite à la suggestion de @Bergi, j'ai ajouté des informations complètes sur mon modèle (simplifié) et les modules requis...</p>
P粉242535777
P粉242535777

répondre à tous(1)
P粉610028841

Fonctionne très bien pour moi.

Par exemple :

user.model.js

const mongoose = require("mongoose");

const UserSchema = mongoose.Schema({
  name: {
    type: String,
    required: "Name is required",
  },
});
module.exports = mongoose.model("User", UserSchema);

user.controller.js

const User = require("./user.model");

const getUser = async (req, res) => {
  try {
    const user = await User.findOne({ name: req.body.name });
    return res.status(200).json(user);
  } catch (err) {
    console.error(`Error finding user ${req.body.name}:`, err);
    return res.status(500).json({ message: err });
  }
}

module.exports = {
  getUser
}

server.js

const express = require('express');
const userController = require('./user.controller');

const app = express();

app.use(express.json())
app.post('/api/getUser', userController.getUser)

module.exports = app;

user.test.js

const chai = require("chai");
const chaiHttp = require("chai-http");
const User = require("./user.model");
const server = require('./server');
chai.use(chaiHttp);
chai.should();

describe("should handle mongoose errors", function () {
  describe("faulty User.findOne method", function () {
    const _User_findOne_Backup = User.findOne;
    beforeEach(function () {
      User.findOne = function () {
        return Promise.reject("forced error");
      };
    });
    afterEach(function () {
      User.findOne = _User_findOne_Backup;
    });

    it("signup should respond with a server error", function () {
      return chai
        .request(server)
        .post("/api/getUser")
        .send({ name: "Alice" })
        .catch((err) => {
          const res = err.response;
          res.should.have.status(500);
        })
        ;
    });
  });
});

Résultats des tests :

  should handle mongoose errors
    faulty User.findOne method
Error finding user Alice: forced error
      ✓ signup should respond with a server error


  1 passing (21ms)

--------------------|----------|----------|----------|----------|-------------------|
File                |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
--------------------|----------|----------|----------|----------|-------------------|
All files           |    89.19 |      100 |    88.89 |    88.57 |                   |
 server.js          |      100 |      100 |      100 |      100 |                   |
 user.controller.js |       80 |      100 |      100 |       75 |               6,7 |
 user.model.js      |      100 |      100 |      100 |      100 |                   |
 user.test.js       |    88.89 |      100 |    85.71 |    88.89 |             26,27 |
--------------------|----------|----------|----------|----------|-------------------|

Version du package :

"chai": "^4.2.0",
"chai-http": "^4.3.0",
"mongodb": "^3.6.3",
"mongoose": "^5.11.9",
"express": "^4.17.1"
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal