3

我在 Laravel Dusk 中创建了一个简单的测试,用户在将电子邮件字段留空时无法注册。测试代码如下:

    /** @test */
    public function a_user_cannot_register_without_filling_in_email_field()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/register')
                ->type('password', $this->user->password)
                ->type('password_confirmation', $this->user->password)
                ->press('Register')
                ->assertSee('The email field is required.');
        });
    }

required从表单输入中删除属性时,此测试通过,但添加时测试失败。

有没有另一种方法来测试这个?

4

3 回答 3

1

我设法通过此测试的方法是执行以下操作:

在目录helpers.php里面创建一个。app确保此文件包含在您autoloaderscomposer.json

"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "files": [
        "app/helpers.php"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},

在里面helpers.php你可以创建以下自定义函数:

<?php

/**
 * Helper to put novalidate on a form when testing
 */

function disableValidationIfTesting() {
    $env = env('APP_ENV');
    if ($env == 'local') {
        echo 'novalidate';
    } else {
        return;
    }
}

更改它以反映您的本地环境名称。有时它可以,testing但在我的例子中它只是local.

然后,在您使用测试检查的表单中,将以下代码添加到您的form

{{ disableValidationIfTesting() }}- 这就是在刀片文件中呈现函数的方式。

在我的例子中,我已经像这样包含它:

<form class="form-horizontal" method="POST" action="{{ route('register') }}" {{ disableValidationIfTesting() }}>

这意味着当我在本地开发和测试时(因为您不应该在生产服务器上使用黄昏),表单会novalidate添加一个属性,允许浏览器跳过 HTML5 验证并继续进行标准的 Laravel 验证。

这样做之后,我所有的测试都没有问题:D

于 2017-09-12T15:16:30.423 回答
0

我也一直在为此苦苦挣扎。我不认为 HTML5 验证错误会在 DOM 中呈现,这意味着黄昏无法检查它们是否实际呈现。(这是因为黄昏使用的web驱动最终使用javascript来获取你网站上的元素点击、获取值、类型等)

在您的情况下,HTML5 验证阻止您的表单提交。这意味着您不会看到自己的错误消息,因为您的代码永远不会验证数据,因此您的错误消息不会被渲染,黄昏也看不到它。

在我的例子中,我刚刚禁用了 HTML5 表单验证,因为它只是一个很好的客户端验证的额外层,但最终并不重要。

于 2017-09-12T08:00:12.597 回答
0

感谢Andy Holmes 的回答,我想出了以下使用脚本,因此只有测试用例会修改它,而我不必更改原始表单源代码。

所以使用$browser->script("document.querySelector('form').noValidate = true");是关键。

<?php
/** @test */
public function a_user_cannot_register_without_filling_in_email_field()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/register')
            ->script("document.querySelector('#form_register').noValidate = true");

        $browser->type('password', $this->user->password)
            ->type('password_confirmation', $this->user->password)
            ->press('Register')
            ->assertSee('The email field is required.');
    });
}
于 2020-02-13T13:21:58.833 回答