欢迎光临
我们一直在努力

使用 PHPUnit 在 Laravel 中测试您的 DOM

使用 phpunit 在 laravel 中测试您的 dom

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 断言

赞(0) 打赏
未经允许不得转载:码农资源网 » 使用 PHPUnit 在 Laravel 中测试您的 DOM
分享到

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册