<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arthur DREVOT</title>
    <description>The latest articles on DEV Community by Arthur DREVOT (@arthurdrevot).</description>
    <link>https://dev.to/arthurdrevot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1080798%2F64c5cebd-cb0e-4590-8824-54b0a902cc6d.png</url>
      <title>DEV Community: Arthur DREVOT</title>
      <link>https://dev.to/arthurdrevot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arthurdrevot"/>
    <language>en</language>
    <item>
      <title>⚡️ Angular 20 : Vitest natif (zoneless) - remplacez Jasmine/Karma</title>
      <dc:creator>Arthur DREVOT</dc:creator>
      <pubDate>Sun, 31 Aug 2025 14:58:14 +0000</pubDate>
      <link>https://dev.to/arthurdrevot/angular-20-vitest-natif-zoneless-remplacez-jasminekarma-3fj3</link>
      <guid>https://dev.to/arthurdrevot/angular-20-vitest-natif-zoneless-remplacez-jasminekarma-3fj3</guid>
      <description>&lt;p&gt;Pendant des années, les projets &lt;strong&gt;Angular&lt;/strong&gt; ont utilisé &lt;strong&gt;Karma&lt;/strong&gt; et &lt;strong&gt;Jasmine&lt;/strong&gt; comme solution de test par défaut. C’est encore le cas aujourd’hui pour de nombreux projets, même si beaucoup de développeurs trouvent l’expérience &lt;strong&gt;lente&lt;/strong&gt; et &lt;strong&gt;peu agréable&lt;/strong&gt;. Certains ont adopté &lt;strong&gt;Jest&lt;/strong&gt; comme alternative, mais son support officiel reste limité et pas totalement abouti.&lt;/p&gt;

&lt;p&gt;Avec &lt;strong&gt;Angular 20&lt;/strong&gt;, on entre dans une nouvelle étape : &lt;strong&gt;Karma peut désormais être remplacé nativement par un runner complet&lt;/strong&gt;. Et ce runner, c’est &lt;strong&gt;Vitest&lt;/strong&gt;, un framework moderne basé sur &lt;strong&gt;Vite&lt;/strong&gt;, qui apporte &lt;strong&gt;rapidité&lt;/strong&gt;, &lt;strong&gt;simplicité&lt;/strong&gt; et une meilleure &lt;strong&gt;expérience développeur&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Personnellement, j’ai été bluffé par la &lt;strong&gt;vitesse d’exécution&lt;/strong&gt; et la &lt;strong&gt;facilité de configuration&lt;/strong&gt; : on a enfin un outil qui rend les tests unitaires aussi fluides que le développement.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Pourquoi choisir Vitest ?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⚡️ &lt;strong&gt;Exécution ultra-rapide&lt;/strong&gt; des tests (fini les minutes d’attente !)&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;Compatibilité native avec Vite&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Syntaxe moderne et intuitive&lt;/strong&gt;, proche de &lt;strong&gt;Jest&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;Support TypeScript intégré&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Candidat naturel pour remplacer Karma&lt;/strong&gt; (en attendant la décision officielle avec &lt;strong&gt;Angular 21&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Prérequis
&lt;/h2&gt;

&lt;p&gt;Avant de commencer, assurez-vous d’avoir un projet Angular déjà créé et les bonnes versions installées :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Angular v20+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js v20.19+&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Ces versions garantissent la compatibilité avec &lt;strong&gt;Vite&lt;/strong&gt; et donc avec &lt;strong&gt;Vitest&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Étape 1 - Installer Vitest
&lt;/h2&gt;

&lt;p&gt;Ajoutez &lt;strong&gt;Vitest&lt;/strong&gt; et son environnement &lt;strong&gt;jsdom&lt;/strong&gt; (simule un DOM dans Node.js, indispensable pour tester Angular) :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; vitest jsdom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;strong&gt;C’est tout !&lt;/strong&gt; Pas besoin de passer par &lt;strong&gt;@analogjs&lt;/strong&gt; ou des &lt;strong&gt;presets communautaires&lt;/strong&gt; pour utiliser Vitest. Toute la configuration se fera &lt;strong&gt;nativement&lt;/strong&gt; dans &lt;strong&gt;Angular 20&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Étape 2 - Créer &lt;code&gt;src/test.ts&lt;/code&gt; (&lt;strong&gt;globals&lt;/strong&gt; + &lt;strong&gt;providers&lt;/strong&gt; par défaut)
&lt;/h2&gt;

&lt;p&gt;Ce fichier sert à deux choses :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;déclarer les &lt;strong&gt;globals Vitest&lt;/strong&gt; côté &lt;strong&gt;TypeScript/IDE&lt;/strong&gt; ;&lt;/li&gt;
&lt;li&gt;définir des &lt;strong&gt;providers de test&lt;/strong&gt; partagés par défaut - ici le &lt;strong&gt;zoneless&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Créez &lt;code&gt;src/test.ts&lt;/code&gt; avec le contenu suivant :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;/// &amp;lt;reference types="vitest/globals" /&amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;provideZonelessChangeDetection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nf"&gt;provideZonelessChangeDetection&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pourquoi ce fichier ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;La directive &lt;strong&gt;&lt;code&gt;/// &amp;lt;reference types="vitest/globals" /&amp;gt;&lt;/code&gt;&lt;/strong&gt; donne la connaissance de &lt;code&gt;describe&lt;/code&gt;, &lt;code&gt;it&lt;/code&gt;, &lt;code&gt;expect&lt;/code&gt;, etc. à &lt;strong&gt;TypeScript&lt;/strong&gt; et à votre &lt;strong&gt;IDE&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Le &lt;strong&gt;tableau exporté&lt;/strong&gt; est lu par le &lt;strong&gt;builder de tests&lt;/strong&gt; (on le déclarera via &lt;strong&gt;&lt;code&gt;providersFile&lt;/code&gt;&lt;/strong&gt; à l’étape 3) pour &lt;strong&gt;appliquer ces providers à tous les tests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;provideZonelessChangeDetection()&lt;/code&gt; active la détection de changements &lt;strong&gt;sans &lt;em&gt;zone.js&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vous pourrez enrichir ce tableau plus tard (ex. &lt;strong&gt;&lt;code&gt;provideNoopAnimations()&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;provideHttpClientTesting()&lt;/code&gt;&lt;/strong&gt;, etc.).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Étape 3 - Configurer &lt;code&gt;angular.json&lt;/code&gt; avec le builder &lt;strong&gt;unit-test&lt;/strong&gt; (Vitest)
&lt;/h2&gt;

&lt;p&gt;Éditez la cible &lt;code&gt;test&lt;/code&gt; de votre projet dans &lt;code&gt;angular.json&lt;/code&gt; pour utiliser le nouveau builder :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"builder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@angular/build:unit-test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vitest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"buildTarget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"::development"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tsConfig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsconfig.spec.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"providersFile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/test.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ce que ça fait
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@angular/build:unit-test&lt;/code&gt;&lt;/strong&gt; : active le &lt;strong&gt;nouveau système de tests&lt;/strong&gt; (expérimental) qui sait piloter &lt;strong&gt;Vitest&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;runner: "vitest"&lt;/code&gt;&lt;/strong&gt; : choisit &lt;strong&gt;Vitest&lt;/strong&gt; (vous pouvez revenir à &lt;code&gt;"karma"&lt;/code&gt; si besoin).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;buildTarget: "::development"&lt;/code&gt;&lt;/strong&gt; : réutilise votre config de build &lt;em&gt;development&lt;/em&gt; pour exécuter les tests (vous pouvez créer un profil dédié &lt;strong&gt;&lt;code&gt;::testing&lt;/code&gt;&lt;/strong&gt; si nécessaire).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tsConfig&lt;/code&gt;&lt;/strong&gt; : pointe vers &lt;strong&gt;&lt;code&gt;tsconfig.spec.json&lt;/code&gt;&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;providersFile&lt;/code&gt;&lt;/strong&gt; : charge vos &lt;strong&gt;providers globaux&lt;/strong&gt; (ici, &lt;strong&gt;zoneless&lt;/strong&gt;) et expose les &lt;strong&gt;globals Vitest&lt;/strong&gt; à l’IDE.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧹 Étape 4 - Supprimer &lt;strong&gt;Karma/Jasmine&lt;/strong&gt; (fichiers + dépendances)
&lt;/h2&gt;

&lt;p&gt;Objectif : retirer tout ce qui est lié à &lt;strong&gt;Karma/Jasmine&lt;/strong&gt; pour éviter les &lt;strong&gt;conflits de types&lt;/strong&gt; et &lt;strong&gt;alléger le projet&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Désinstaller les packages&lt;/strong&gt; (adaptez selon votre projet) :
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   npm remove &lt;span class="nt"&gt;--save-dev&lt;/span&gt; karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter jasmine-core @types/jasmine @types/jasminewd2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Supprimer les fichiers/configs Karma&lt;/strong&gt; :

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;karma.conf.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;l’ancien &lt;code&gt;src/test.ts&lt;/code&gt; de Karma (si présent) - &lt;strong&gt;à ne pas confondre&lt;/strong&gt; avec le nouveau &lt;code&gt;src/test.ts&lt;/code&gt; créé à l’étape 2.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nettoyer TypeScript&lt;/strong&gt; :

&lt;ul&gt;
&lt;li&gt;vérifiez que &lt;code&gt;tsconfig.spec.json&lt;/code&gt; &lt;strong&gt;ne contient plus&lt;/strong&gt; &lt;code&gt;"jasmine"&lt;/code&gt; dans &lt;code&gt;compilerOptions.types&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ▶️ Étape 5 - &lt;strong&gt;Lancer les tests&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dans ce setup &lt;strong&gt;“100% natif Angular 20 + Vitest”&lt;/strong&gt;, exécutez simplement :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vous obtenez une &lt;strong&gt;exécution rapide&lt;/strong&gt;, un &lt;strong&gt;retour lisible&lt;/strong&gt;, et un environnement DOM simulé grâce à &lt;strong&gt;jsdom&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏁 Conclusion
&lt;/h2&gt;

&lt;p&gt;Avec &lt;strong&gt;Angular 20&lt;/strong&gt;, on peut enfin &lt;strong&gt;utiliser Vitest nativement&lt;/strong&gt; : installation minimale (&lt;strong&gt;&lt;code&gt;vitest&lt;/code&gt; + &lt;code&gt;jsdom&lt;/code&gt;&lt;/strong&gt;), un fichier &lt;strong&gt;&lt;code&gt;src/test.ts&lt;/code&gt;&lt;/strong&gt; pour les &lt;strong&gt;globals + providers (zoneless)&lt;/strong&gt;, la config &lt;strong&gt;&lt;code&gt;angular.json&lt;/code&gt;&lt;/strong&gt; avec le builder &lt;strong&gt;&lt;code&gt;@angular/build:unit-test&lt;/code&gt;&lt;/strong&gt;, et un simple &lt;strong&gt;&lt;code&gt;ng test&lt;/code&gt;&lt;/strong&gt; pour la suite. &lt;strong&gt;Plus besoin de presets communautaires&lt;/strong&gt; - la configuration reste &lt;strong&gt;sobre, claire et durable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Démo : &lt;a href="https://github.com/ArthurDrevot/angular-vitest-zoneless" rel="noopener noreferrer"&gt;https://github.com/ArthurDrevot/angular-vitest-zoneless&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Discutons !
&lt;/h2&gt;

&lt;p&gt;Une question, un retour d’expérience, une astuce à partager ? &lt;strong&gt;Laissez un commentaire&lt;/strong&gt; 👇&lt;br&gt;&lt;br&gt;
Et si vous voulez aller &lt;strong&gt;plus loin&lt;/strong&gt; (&lt;strong&gt;coverage&lt;/strong&gt;, &lt;strong&gt;UI&lt;/strong&gt;, &lt;strong&gt;CI&lt;/strong&gt;,  ...), &lt;strong&gt;envoyez-moi un message&lt;/strong&gt; : je publierai volontiers un guide “&lt;strong&gt;configuration avancée&lt;/strong&gt;” sur le &lt;strong&gt;builder Vitest natif&lt;/strong&gt; pour Angular.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>vite</category>
      <category>testing</category>
      <category>zoneless</category>
    </item>
  </channel>
</rss>
