Maison >développement back-end >tutoriel php >Testez votre DOM dans Laravel avec PHPUnit

Testez votre DOM dans Laravel avec PHPUnit

王林
王林original
2024-07-22 09:06:42589parcourir

Test Your DOM in Laravel with PHPUnit

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.

Cas d'utilisation

Je dois tester que certains formulaires génèrent un jeton CSRF.

Solution de base

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);

Améliorer l'itération

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.

Viser la manière Laravelish

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn