首頁 >後端開發 >php教程 >使用 PHPUnit 在 Laravel 測試您的 DOM

使用 PHPUnit 在 Laravel 測試您的 DOM

王林
王林原創
2024-07-22 09:06:42592瀏覽

Test Your DOM in Laravel with PHPUnit

PHPUnit 開箱即用,具有AssertSee 和AssertSeeText 等功能,在這兩種情況下,我們都可以針對特定文本進行斷言,為了斷言HTML 標籤,我們將依靠這些功能和一些自訂功能努力完善這些。

使用案例

我需要測試某些表單是否有 CSRF 令牌。

基本解決方案

Laravel CSRF 令牌指令產生如下輸入:

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

由於產生的令牌在請求之間發生變化,我們不會測試產生的令牌值,而是斷言輸入存在並具有某些所需的屬性,PHPUnit assertSee 有第二個參數來轉義值,因此我們可以做這樣的事情:

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

改進迭代

它可以解決我們的解決方案,但可能有更好的方法可以在更多情況下使用它,因此使用“一廂情願”的方法編寫我想要的程式碼將是這樣的:

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

這將很有用,因為它添加了一個斷言,只需傳遞標籤名稱和屬性數組即可在多種情況下工作

我們可以在 Laravel 中加入類似的內容,方法是在 AppServiceProvider 或任何其他自訂 Provider 中的 TestResponse 類別中新增自訂巨集:

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

現在我們可以透過測試標籤和屬性的存在來測試我們的 DOM。

瞄準 Laravelish 方式

在這種情況下,我們可以向前推進一點,我需要在應用程式中以多種形式斷言表單作為CSRF 令牌,因此我們可以依靠我們的巨集來創建更多斷言,在本例中如預期HTML 標籤和屬性不會改變我可以添加以下內容:

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

這個斷言簡短、可重複使用、易於閱讀和使用:

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

要獲得更強大的斷言,您應該考慮一個優秀的包,例如:

sinnbeck/laravel-dom-斷言

希望這有助於在您的測試中添加基本的 DOM 斷言

以上是使用 PHPUnit 在 Laravel 測試您的 DOM的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn