使用 PHPUnit 在 Laravel 中测试您的 DOM

王林
发布: 2024-07-22 09:06:42
原创
561 人浏览过

Test Your DOM in Laravel with PHPUnit

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。

瞄准 Laravelish 方式

在这种情况下,我们可以向前推进一点,我需要在应用程序中以多种形式断言表单作为 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!