JavaScript : rendre le Web interactif (école d'ingénieur) · Chapitre 11 · Exercice de TD
Tester sans serveur
Erreurs, stockage et qualité du code · niveau 3 (difficile)
Énoncé
Tester obtenirJson (chapitre 10) sans lancer de serveur, en remplaçant globalThis.fetch par une doublure. Quatre cas : un 200 (vérifier aussi l'adresse demandée), un 404 avec message JSON, un 500 dont le corps n'est pas du JSON, une panne réseau. Penser à rétablir le vrai fetch après chaque test.
Corrigé
import { test, afterEach } from "node:test";
import assert from "node:assert/strict";
import { obtenirJson, ErreurHttp } from "../../../ch10/obtenir-json.mjs";
const vraiFetch = globalThis.fetch;
afterEach(() => {
globalThis.fetch = vraiFetch;
});
// Fabrique une fausse réponse, avec juste ce dont obtenirJson se sert.
function reponse(status, corps) {
return { ok: status >= 200 && status < 300, status, json: async () => corps };
}
test("un statut 200 donne le corps JSON", async () => {
const appels = [];
globalThis.fetch = async (url) => {
appels.push(url);
return reponse(200, { titre: "Java" });
};
assert.deepEqual(await obtenirJson("/api/livres/1"), { titre: "Java" });
assert.deepEqual(appels, ["/api/livres/1"]);
});
test("un 404 lève une ErreurHttp avec le message du serveur", async () => {
globalThis.fetch = async () => reponse(404, { erreur: "Aucun livre d’ISBN 1." });
await assert.rejects(obtenirJson("/api/livres/1"), (e) => {
assert.ok(e instanceof ErreurHttp);
assert.equal(e.statut, 404);
assert.equal(e.message, "Aucun livre d’ISBN 1.");
return true;
});
});
test("un 500 sans corps JSON donne un message générique", async () => {
globalThis.fetch = async () => ({ ok: false, status: 500, json: async () => { throw new SyntaxError("pas du JSON"); } });
await assert.rejects(obtenirJson("/api/livres"), { name: "ErreurHttp", message: "erreur HTTP 500" });
});
test("une panne réseau traverse telle quelle", async () => {
globalThis.fetch = async () => {
throw new TypeError("fetch failed");
};
await assert.rejects(obtenirJson("/api/livres"), TypeError);
});
Les quatre tests passent (exercices/ex8-tests/). La doublure n'a que ce qu'utilise obtenirJson (ok, status, json) : un objet de ce genre suffit, inutile de reproduire toute la classe Response. Sans afterEach, la doublure du dernier test resterait en place pour la suite.
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.