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();
对于更强大的断言,您应该考虑一个优秀的包,例如:
辛贝克/laravel-dom-断言
希望这有助于在您的测试中添加基本的 dom 断言
PHP 函数与 WordPress 函数比较
PHP短信应用:如何共享短信包及代码更新后是否需重启服务器?
如何使用 PHP 将 MySQL 数据库中的名单显示到前端?
PHP命令行工具开发中如何处理异常?
Lighthouse和PageSpeed Insights无法检测到HTML中的doctype和meta标签的原因可能有以下几种:解析错误:如果HTML文档的结构有问题,导致解析器无法正确识别doctype和meta标签,这些工具可能就无法检测到这些标签。例如,如果doctype声明之前有其他内容,或者meta标签的格式不正确,都可能导致检测失败。缓存问题:有时浏览器或工具的缓存可能会导致检测结果不准确。如果你最近对页面进行了修改,但工具仍然使用旧的缓存数据,就会出现这种情况。尝试清除缓存并重新运行检测。
PHP函数测试与调试有什么需要注意的?