Adloun

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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →