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><h2> 改进迭代 </h2> <p>它可以解决我们的解决方案,但可能有更好的方法可以在更多情况下使用它,因此使用“一厢情愿”的方法编写我想要的代码将是这样的:<br></p> <pre class="brush:php;toolbar: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 = "assertsee([$htmlelement], false); });
现在我们可以通过测试标签和属性的存在来测试我们的 dom。
立即学习“PHP免费学习笔记(深入)”;
瞄准 laravelish 方式
在这种情况下,我们可以向前推进一点,我需要在应用程序中以多种形式断言表单作为 csrf 令牌,因此我们可以依靠我们的宏来创建更多断言,在本例中作为预期的 html 标签并且属性不会改变我可以添加这样的东西:
testresponse::macro('assertcsrftokenexists', function () { $this->asserthtml('input', [ "type" => "hidden", "name" => "_token", ]); });
这个断言很短,可重复使用,易于阅读和使用:
$this->get("contact-us")->assertCSRFTokenExists();
对于更强大的断言,您应该考虑一个优秀的包,例如:
辛贝克/laravel-dom-断言
希望这有助于在您的测试中添加基本的 dom 断言
想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » 使用 PHPUnit 在 Laravel 中测试您的 DOM
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » 使用 PHPUnit 在 Laravel 中测试您的 DOM