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中文网其他相关文章!