Heim  >  Artikel  >  Backend-Entwicklung  >  Testen Sie Ihr DOM in Laravel mit PHPUnit

Testen Sie Ihr DOM in Laravel mit PHPUnit

王林
王林Original
2024-07-22 09:06:42564Durchsuche

Test Your DOM in Laravel with PHPUnit

PHPUnit verfügt standardmäßig über Funktionen wie AssertSee und AssertSeeText. In beiden Fällen können wir gegen einen bestimmten Text behaupten. Um HTML-Tags zu behaupten, werden wir uns mit einigen benutzerdefinierten Funktionen auf diese Funktionen verlassen Arbeiten Sie daran, diese noch ein wenig zu polieren.

Anwendungsfall

Ich muss testen, ob einige Formulare ein CSRF-Token generieren.

Grundlegende Lösung

Die CSRF-Token-Anweisung von Laravel generiert eine Eingabe wie diese:

<input type="hidden" name="_token" value="random_generated_token" ...>

Da sich das generierte Token zwischen Anfragen ändert, werden wir den generierten Token-Wert nicht testen, sondern bestätigen, dass die Eingabe mit einigen der erforderlichen Attribute vorhanden ist. PHPUnit „assetSee“ verfügt über einen zweiten Parameter, um einen Wert zu maskieren, damit wir dies können Mach so etwas:

$this
    ->get("contact-us")
    ->assertSee([
        '<input name="some_database_column"'
    ], false);

Verbesserung der Iteration

Es würde unsere Lösung lösen, aber wahrscheinlich gibt es eine bessere Möglichkeit, dies für mehr Fälle zu verwenden, also würde das Schreiben meines gewünschten Codes mit einem „Wunschdenken“-Ansatz etwa so aussehen:

$this->get("contact-us")
    ->assertHtml('input', [
        "type" => "hidden",
        "name" => "_token",
])

Dies wäre nützlich, da es eine Behauptung hinzufügt, die in mehreren Fällen funktionieren würde, indem nur der Tag-Name und ein Array von Attributen übergeben werden

Wir können so etwas in Laravel hinzufügen, indem wir ein benutzerdefiniertes Makro zur TestResponse-Klasse im AppServiceProvider oder einem anderen benutzerdefinierten Anbieter hinzufügen:

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

Jetzt können wir unser DOM testen, indem wir das Vorhandensein eines Tags und eines Attributs testen.

Zielender Laravelish-Weg

In diesem Fall können wir noch einen Schritt weitergehen. Ich müsste ein Formular als CSRF-Token in mehreren Formularen in der App bestätigen, damit wir uns darauf verlassen können, dass unser Makro weitere Behauptungen erstellt, in diesem Fall wie erwartet HTML-Tag und -Attribute würden sich nicht ändern. Ich kann so etwas hinzufügen:

TestResponse::macro('assertCSRFTokenExists', function () {
    $this->assertHtml('input', [
        "type" => "hidden",
        "name" => "_token",
    ]);
});

Diese Aussage ist kurz, wiederverwendbar, leicht zu lesen und zu verwenden:

$this->get("contact-us")->assertCSRFTokenExists();

Für aussagekräftigere Aussagen sollten Sie ein hervorragendes Paket in Betracht ziehen wie:

sinnbeck/laravel-dom-assertions

Hoffentlich hilft dies dabei, grundlegende DOM-Behauptungen in Ihre Tests einzufügen

Das obige ist der detaillierte Inhalt vonTesten Sie Ihr DOM in Laravel mit PHPUnit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn