Тестирование проверки HTML5 с помощью Laravel Dusk

Я создаю простой тест внутри 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 удаляется из ввода формы, этот тест проходит, но когда он добавляется, тест не проходит.

Есть ли другой способ проверить это?


person Andy Holmes    schedule 08.09.2017    source источник


Ответы (3)


Мне удалось пройти этот тест следующим образом:

Создайте helpers.php внутри каталога app. Убедитесь, что этот файл включен в ваш autoloaders в composer.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

person Andy Holmes    schedule 12.09.2017

Я тоже боролся с этим. Я не думаю, что ошибки проверки HTML5 отображаются в DOM, что означает, что dusk не может проверить, действительно ли они отображаются или нет. (это потому, что веб-драйвер, который используется в сумраке, в конечном итоге использует javascript, чтобы заставить элементы на вашем веб-сайте щелкать, получать значение, вводить и т. д.)

В вашем случае проверка HTML5 препятствует отправке вашей формы. Это означает, что вы не увидите свое собственное сообщение об ошибке, поскольку данные никогда не проверяются вашим кодом, и, следовательно, ваше сообщение об ошибке не отображается, и dusk не видит его.

В моем случае я просто отключил проверку формы HTML5, так как это был просто дополнительный уровень хорошей проверки на стороне клиента, но в конечном итоге не критичный.

person Ruben Beeftink    schedule 12.09.2017

Благодаря ответу Энди Холмса я придумал следующий сценарий использования, так что только тестовый пример изменяет это, и я не Не нужно изменять исходный код исходной формы.

Так что использование $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.');
    });
}
person Alexander Taubenkorb    schedule 13.02.2020