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。
在這種情況下,我們可以向前推進一點,我需要在應用程式中以多種形式斷言表單作為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中文網其他相關文章!