<?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: Driss Nafii</title>
    <description>The latest articles on DEV Community by Driss Nafii (@drissnafii).</description>
    <link>https://dev.to/drissnafii</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%2F2960181%2F74b66fb6-f47b-40ef-bdf1-fb84d48b3a5e.jpg</url>
      <title>DEV Community: Driss Nafii</title>
      <link>https://dev.to/drissnafii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/drissnafii"/>
    <language>en</language>
    <item>
      <title>honeypot 🐝</title>
      <dc:creator>Driss Nafii</dc:creator>
      <pubDate>Wed, 26 Mar 2025 11:01:14 +0000</pubDate>
      <link>https://dev.to/drissnafii/honeypot-1j6p</link>
      <guid>https://dev.to/drissnafii/honeypot-1j6p</guid>
      <description>&lt;p&gt;Bien sûr ! La technique du &lt;strong&gt;"honeypot"&lt;/strong&gt; (littéralement "pot de miel") est une méthode de protection contre les spams. C'est une solution intelligente et non intrusive qui repose sur l'idée de créer un "piège" spécifique pour les robots spammeurs. Voici une explication plus détaillée :&lt;/p&gt;

&lt;h3&gt;
  
  
  Comment ça fonctionne ?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ajout de champs cachés&lt;/strong&gt; : Dans un formulaire (par exemple, un formulaire de commentaire ou d'inscription), vous ajoutez un ou plusieurs champs supplémentaires, comme "email_confirm" ou "extra_field".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ces champs sont rendus &lt;em&gt;invisibles&lt;/em&gt; pour les utilisateurs humains en utilisant du CSS, comme :
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt; &lt;span class="nc"&gt;.honeypot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
     &lt;span class="nl"&gt;visibility&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&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;p&gt;Les humains ne voient donc pas ces champs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Les robots remplissent tout&lt;/strong&gt; : Les robots spammeurs, lorsqu'ils analysent le HTML de la page, ne tiennent pas compte du CSS. Ils détectent et remplissent automatiquement &lt;strong&gt;tous les champs&lt;/strong&gt;, y compris les champs cachés.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Détection de spam&lt;/strong&gt; : Du côté serveur, vous vérifiez si l'un des champs cachés est rempli. Si c'est le cas, cela indique que c'est un robot qui a soumis le formulaire, et la requête est rejetée comme spam.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pourquoi est-ce efficace ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Les humains n'interagissent pas&lt;/strong&gt; : Les utilisateurs humains ne peuvent pas interagir avec ces champs cachés puisqu'ils ne les voient pas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple et rapide&lt;/strong&gt; : C'est facile à mettre en place et ne nécessite pas d'outils complexes comme les CAPTCHAs, qui peuvent être frustrants pour les utilisateurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemple en Laravel :
&lt;/h3&gt;

&lt;p&gt;Voici comment vous pourriez implémenter cette technique en Laravel :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ajout d'un champ dans le formulaire :&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"honeypot_field"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"honeypot"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Vérification dans le contrôleur :&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Request&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'honeypot_field'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="c1"&gt;// C'est un robot, rejetez la requête&lt;/span&gt;
           &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Spam detected'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
       &lt;span class="p"&gt;}&lt;/span&gt;

       &lt;span class="c1"&gt;// Continuer avec le traitement normal&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Les avantages :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invisible pour les utilisateurs&lt;/strong&gt; : Contrairement aux CAPTCHAs, cela n'ajoute aucune friction pour les humains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aucun coût supplémentaire&lt;/strong&gt; : Pas besoin d'utiliser de services tiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discret mais puissant&lt;/strong&gt; : Très efficace contre les robots basiques.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Les limites :
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Certains robots plus avancés ignorent les champs invisibles en CSS et peuvent contourner cette technique. Dans ces cas, il pourrait être nécessaire d'ajouter des mesures supplémentaires comme des CAPTCHAs ou des vérifications sur le serveur.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>testing</category>
      <category>laravel</category>
    </item>
    <item>
      <title>Test Unitaire Laravel</title>
      <dc:creator>Driss Nafii</dc:creator>
      <pubDate>Wed, 26 Mar 2025 10:35:45 +0000</pubDate>
      <link>https://dev.to/drissnafii/test-unitaire-laravel-4mnp</link>
      <guid>https://dev.to/drissnafii/test-unitaire-laravel-4mnp</guid>
      <description>&lt;h1&gt;
  
  
  Salut l'ami développeur Laravel !
&lt;/h1&gt;

&lt;p&gt;C'est super que tu veuilles te plonger dans les tests unitaires. C'est une compétence essentielle pour écrire du code de qualité, robuste et maintenable. En tant que ton inst&lt;br&gt;
ructeur Laravel, je vais te guider pas à pas à travers cette leçon. Accroche-toi, on va devenir des pros du test !&lt;/p&gt;


&lt;h2&gt;
  
  
  📜 Leçon sur les Tests Unitaires dans Laravel
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🛠️ Qu'est-ce qu'un Test Unitaire ?
&lt;/h3&gt;

&lt;p&gt;Imagine que tu construis une maison avec des briques LEGO. Un test unitaire, c'est comme vérifier individuellement chaque brique pour s'assurer qu'elle est de la bonne forme, de la bonne couleur et qu'elle s'emboîte correctement.&lt;/p&gt;

&lt;p&gt;Dans le monde du développement, une "brique" représente la plus petite unité de code testable : une fonction, une méthode dans une classe, etc. L'objectif est de tester chaque partie de manière isolée.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔄 Pourquoi les Tests Unitaires sont-ils Importants ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Détection précoce des erreurs&lt;/strong&gt; : Débuguer plus tôt, c'est corriger plus facilement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amélioration de la qualité du code&lt;/strong&gt; : Rendre le code plus modulaire et maintenable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitation de la refactorisation&lt;/strong&gt; : Modifier le code sans stress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation vivante&lt;/strong&gt; : Les tests montrent comment le code fonctionne.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confiance et productivité&lt;/strong&gt; : Déployer avec plus de sérénité.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🎉 Les Tests Unitaires dans Laravel
&lt;/h2&gt;

&lt;p&gt;Laravel prend en charge PHPUnit, un framework de test populaire.&lt;/p&gt;
&lt;h3&gt;
  
  
  📚 Structure des Tests
&lt;/h3&gt;

&lt;p&gt;Les tests unitaires sont situés dans &lt;code&gt;tests/Unit&lt;/code&gt;. Chaque fichier de test correspond à une classe ou fonctionnalité et porte le suffixe &lt;code&gt;Test.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Exemple :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Calculator.php&lt;/code&gt; ➞ &lt;code&gt;CalculatorTest.php&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📝 Écrire un Test Unitaire de Base
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Créer un fichier de test&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   php artisan make:test CalculatorTest &lt;span class="nt"&gt;--unit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Définir la classe de test&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;   &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
   &lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Tests\Unit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CalculatorTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TestCase&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testAddition&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
       &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="nv"&gt;$calculator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;\App\Services\Calculator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
           &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$calculator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
           &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Utiliser les assertions&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;   &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$condition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$condition&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Exécuter les tests&lt;/strong&gt; :
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   php artisan &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--unit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📒 Exemple Pratique : Tester une Fonction Simple
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Fonction&lt;/em&gt; &lt;code&gt;capitalizeFirstLetter&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Helpers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StringHelper&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;capitalizeFirstLetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;ucfirst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$string&lt;/span&gt;&lt;span class="p"&gt;);&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;p&gt;&lt;strong&gt;&lt;em&gt;Test unitaire&lt;/em&gt; &lt;code&gt;StringHelperTest.php&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Tests\Unit\Helpers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Helpers\StringHelper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PHPUnit\Framework\TestCase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StringHelperTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TestCase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testCapitalizeFirstLetter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Hello'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StringHelper&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;capitalizeFirstLetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hello'&lt;/span&gt;&lt;span class="p"&gt;));&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;p&gt;&lt;strong&gt;Exécution des tests&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--unit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Bonnes Pratiques
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Principe AAA (Arrange-Act-Assert)&lt;/strong&gt; :&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Arrange&lt;/strong&gt; : Prépare les données&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Act&lt;/strong&gt; : Exécute l'action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assert&lt;/strong&gt; : Vérifie le résultat&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nommage clair des tests&lt;/strong&gt; : &lt;code&gt;testUserCanBeCreatedWithValidData()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tester les cas limites&lt;/strong&gt; (chaîne vide, null, erreurs)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utiliser des Data Providers pour réduire la redondance&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explorer le Mocking pour tester sans dépendances externes&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Tâches à Réaliser
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer une classe &lt;code&gt;Calculator&lt;/code&gt;&lt;/strong&gt; avec les méthodes :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;subtract&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;&lt;code&gt;multiply&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;divide&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Écrire des tests unitaires&lt;/strong&gt; pour la classe &lt;code&gt;Calculator&lt;/code&gt; dans &lt;code&gt;CalculatorTest.php&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Créer un modèle &lt;code&gt;Article&lt;/code&gt;&lt;/strong&gt; avec les propriétés :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;body&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_published&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ajouter une méthode &lt;code&gt;isPublished&lt;/code&gt;&lt;/strong&gt; et la tester dans &lt;code&gt;ArticleTest.php&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>testing</category>
      <category>laravel</category>
    </item>
  </channel>
</rss>
