Vue : construire une application web (école d'ingénieur) · Chapitre 11 · Application directe du cours
Corriger le composant fautif
Tests et mise en production · niveau 1 (application)
Énoncé
Corriger ListeFautive.vue (section « ESLint et les règles de Vue ») pour qu'ESLint n'ait plus rien à signaler, sans changer ce que voit l'utilisateur : la liste des seuls livres en stock, et un bouton qui efface le filtre. Écrire un test qui le vérifie.
Corrigé
<script setup>
import { computed } from "vue";
const props = defineProps({
livres: { type: Array, required: true },
});
// Le filtre appartient au parent : v-model:filtre le lui renvoie.
const filtre = defineModel("filtre", { type: String, default: "" });
// Filtrer dans un computed, plutôt que mêler v-if et v-for.
const disponibles = computed(() => props.livres.filter((livre) => livre.stock > 0));
function effacer() {
filtre.value = "";
}
</script>
<template>
<ul>
<li
v-for="livre in disponibles"
:key="livre.isbn"
>
{{ livre.titre }}
</li>
</ul>
<button
type="button"
@click="effacer"
>
Effacer
</button>
</template>
$ npx eslint src/ListeCorrigee.vue
(aucun message : le fichier est conforme)
- La prop n'est plus modifiée : le filtre devient un
defineModel, et effacer demande au parent de changer sa valeur (événementupdate:filtre). - Le filtrage passe dans un
computed, et chaque élément de la liste a sa clé.
Le test vérifie que l'utilisateur voit la même chose qu'avant :
// Exercice 11.8 : la liste corrigée se comporte comme prévu.
import { test, expect } from "vitest";
import { mount } from "@vue/test-utils";
import ListeCorrigee from "../src/ListeCorrigee.vue";
test("livres disponibles seulement, et Effacer émet un filtre vide", async () => {
const livres = [
{ isbn: "1", titre: "Programmation Java", stock: 12 },
{ isbn: "2", titre: "Physique générale", stock: 0 },
];
const liste = mount(ListeCorrigee, { props: { livres, filtre: "phy" } });
expect(liste.findAll("li").map((li) => li.text())).toEqual(["Programmation Java"]);
await liste.find("button").trigger("click");
expect(liste.emitted("update:filtre")).toEqual([[""]]);
});
✓ tests/ex8-liste.test.js (1 test)
✓ livres disponibles seulement, et Effacer émet un filtre vide100 % 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.