PHPUnit sort de la boîte avec des fonctionnalités comme AssertSee et AssertSeeText dans les deux cas, nous pouvons affirmer contre un texte spécifique, pour affirmer les balises HTML, nous allons nous appuyer sur ces fonctionnalités avec des fonctionnalités personnalisées travaillez pour les peaufiner un peu plus.
Je dois tester que certains formulaires génèrent un jeton CSRF.
La directive de jeton Laravel CSRF génère une entrée comme celle-ci :
<input type="hidden" name="_token" value="random_generated_token" ...>
Comme le jeton généré change entre les requêtes, nous n'allons pas tester la valeur du jeton généré, nous allons plutôt affirmer que l'entrée existe avec certains des attributs requis, PHPUnit assertSee a un deuxième paramètre pour échapper à une valeur afin que nous puissions fais quelque chose comme ça :
$this ->get("contact-us") ->assertSee([ '<input name="some_database_column"' ], false);
Cela résoudrait notre solution, mais il existe probablement une meilleure façon de l'utiliser pour plus de cas, donc en écrivant en utilisant une approche de « vœu pieux », mon code souhaité ressemblerait à ceci :
$this->get("contact-us") ->assertHtml('input', [ "type" => "hidden", "name" => "_token", ])
Ce serait utile car cela ajoute une assertion qui fonctionnerait dans plusieurs cas en transmettant uniquement le nom de la balise et un tableau d'attributs
Nous pouvons ajouter quelque chose comme ceci dans Laravel en ajoutant une macro personnalisée à la classe TestResponse dans AppServiceProvider ou tout autre fournisseur personnalisé :
TestResponse::macro('assertHtml', function ($tag, $attributes) { $attributes = collect($attributes) ->map(function ($attributeValue, $attributeKey) { return "$attributeKey=\"$attributeValue\" "; }) ->values() ->implode("", ""); $htmlElement = "<$tag $attributes"; $this->assertSee([$htmlElement], false); });
Nous pouvons désormais tester notre DOM en testant la présence d'une balise et d'un attribut.
Nous pouvons aller un peu plus loin dans ce cas, j'aurais besoin d'affirmer qu'un formulaire sous forme de jetons CSRF sous plusieurs formes dans l'application, afin que nous puissions nous appuyer sur notre macro pour créer plus d'assertions, dans ce cas comme prévu La balise HTML et les attributs ne changeraient pas. Je peux ajouter quelque chose comme ceci :
TestResponse::macro('assertCSRFTokenExists', function () { $this->assertHtml('input', [ "type" => "hidden", "name" => "_token", ]); });
Cette assertion est courte, réutilisable, facile à lire et à utiliser :
$this->get("contact-us")->assertCSRFTokenExists();
Pour des assertions plus puissantes, vous devriez envisager un excellent package comme :
sinnbeck/laravel-dom-assertions
J'espère que cela vous aidera à ajouter des assertions DOM de base dans vos tests
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!