• Час читання ~5 хв
  • 30.07.2023

Передумови

У цьому посібнику ми перевіримо правила перевірки для реєстрації користувачів. Однак концепція застосовується і до інших сценаріїв. Я припускаю, що:

Навіщо перевіряти правила валідації?

  • Щоб переконатися, що правила перевірки працюють належним чином. Тестування гарантує, що ваша програма не приймає недійсні дані, що може мати наслідки для безпеки або продуктивності.
  • Для виявлення помилок у правилах перевірки. За допомогою тестів ви можете виявити помилки досить рано і запобігти їх проблеми на виробництві.
  • Щоб покращити якість коду. Коли ви тестуєте свої правила валідації, ви змушені думати про те, як вони працюють і як їх слід тестувати.

Тестування реєстрації

користувачів Оновіть свій PHPUnit

Я вважаю за краще використовувати базу даних sqlite :memory: під час тестування моєї програми на простоту. Це не тільки прискорює тестування, але й не вимагає додаткового налаштування бази даних. Оновіть phpunit.xml файл наступним чином.

<!-- <env name="DB_CONNECTION" value="sqlite"/> -->        
<!-- <env name="DB_DATABASE" value=":memory:"/> -->        
<env name="DB_CONNECTION" value="sqlite"/>  
<env name="DB_DATABASE" value=":memory:"/>   

Щоб забезпечити автоматичну міграцію бази даних під час тестів, оновіть Pest.php файл

uses(
    Tests\TestCase::class,
// Illuminate\Foundation\Testing\RefreshDatabase::class,
Illuminate\Foundation\Testing\LazilyRefreshDatabase::class,
)->in('Feature');

Логіка

реєстрації Припустимо, у вас є маршрут реєстрації, маршрут вказує на ваш контролер, який підтверджує запит,

use App\Http\Controllers\RegistrationController;
Route::view('/','welcome')->name('home');
Route::post('/register', RegistrationController::class)->name('register');

створює нового користувача та перенаправляє на домашню сторінку:

<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rules\Password;
class RegistrationController
{
    public function __invoke(Request $request)
    {
        $validated = $request->validate([
            'name' => ['required', 'string', 'min:4', 'max:80'],
            'email' => ['required', 'email', 'max:100', 'unique:users'],
            'password' => ['required', Password::min(size: 8)->uncompromised(), 'max:64'],
        ]);
        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => Hash::make($validated['password']),
        ]);
        session()->flash(
            key: 'status',
            value: __(
                key: 'messages.user.created',
                replace: ['name' => $user->name]
            )
        );
        return to_route(route: 'home');
    }
}

Де знаходиться

<?php  
  
declare(strict_types=1);  
  
return [  
    'user' => [  
        'created' => "Welcome :name! You're now a member of our community."  
    ]  
];

вміст lang/en/messages.php файлів Тестування за допомогою наборів

даних PHP від шкідників Почніть зі створення нового тесту функцій за допомогою команди нижче. Новий файл повинен бути створений в розділі tests/Feature/Feature/RegistrationControllerTest.php

php artisan make:test Feature/RegistrationControllerTest --pest

Найпростіший спосіб перевірити кілька перевірок - використовувати набори даних php від шкідників. Код файлу RegistrationControllerTest.php виглядатиме так.

<?php

use App\Models\User;
use Illuminate\Support\Str;

function getLongName(): string
{
    return Str::repeat(string: 'name', times: rand(min: 30, max: 50));
}

function getATakenEmail(): string
{
    $takenEmail = '[email protected]';
    User::factory()->create(['email' => $takenEmail]);
    return $takenEmail;
}

dataset(name: 'validation-rules', dataset: [
    'name is required' => ['name', '', fn() => __(key: 'validation.custom.name.required')],
    'name be a string' => ['name', ['array'], fn() => __(key: 'validation.custom.name.string')],
    'name not too short' => ['name', 'ams', fn() => __(key: 'validation.custom.name.min')],
    'name not too long' => ['name', getLongName(), fn() => __(key: 'validation.custom.name.max')],

    'email is required' => ['email', '', fn() => __(key: 'validation.custom.email.required')],
    'email be valid' => ['email', 'esthernjerigmail.com', fn() => __(key: 'validation.custom.email.email')],
    'email not too long' => ['email', fn() => getLongName() . '@gmail.com', fn() => __(key: 'validation.custom.email.max')],
    'email be unique' => ['email', fn() => getATakenEmail(), fn() => __(key: 'validation.custom.email.unique')],

    'password is required' => ['password', '', fn() => __(key: 'validation.custom.password.required')],
    'password be >=8 chars' => ['password', 'Hf^gsg8', fn() => __(key: 'validation.custom.password.min')],
    'password be uncompromised' => ['password', 'password', 'The given password has appeared in a data leak. Please choose a different password.'],
    'password not too long' => ['password', fn() => getLongName(), fn() => __(key: 'validation.custom.password.max')],
]);


it(
    description: 'can validate user inputs',
    closure: function (string $field, string|array $value, string $message) {

    $data = [
        'name' => fake()->name(),
        'email' => fake()->unique()->email(),
        'password' => fake()->password(minLength: 8),
    ];

    $response = $this->post(
        uri: route(name: 'register'),
        data: [...$data, $field => $value]
    );

    $response->assertSessionHasErrors(keys: [$field => $message]);

    $this->assertGuest();
})->with('validation-rules');

Примітка: Порядок правил перевірки відповідав порядку в повідомленні Мені RegistrationController.php

подобається настроювати перевірку, створивши lang/en/validation.php файл і додавши такий вміст:

<?php

declare(strict_types=1);

return [

    'custom' => [
        'name' => [
            'required' => 'Please enter your name.',
            'string' => 'Your name is missing.',
            'min' => 'Name is too short. Try your first and last name.',
            'max' => 'Name is too long. Please shorten your name and try again.',
        ],
        'email' => [
            'required' => 'Email address is required.',
            'email' => 'Enter a valid email e.g [email protected].',
            'max' => 'Email is too long. Please shorten your email and try again.',
            'unique' => 'Email is already registered. Try another one or reset password.',
        ],
        'password' => [
            'required' => 'Enter a password.',
            'min'      => 'Password should be at least 8 characters. Add a word or two.',
            'max'      => 'Password needs to be less than 128 characters. Please enter a short one.'
        ],
    ],
];

Тестування виводу

Запустіть тест, запустивши

vendor/bin/pest --filter="RegistrationControllerTest"

Результат повинен виглядати так: Pest CLI output

Пояснення

коду Про getLongName() програму та getATakenEmail()

Це користувацька допоміжна функція, яку я створив для спрощення коду. Вони багаторазові і зручні. Ви можете дізнатися більше про допоміжні функції з документації

шкідників Структура

наборів даних Розглянемо наступні підмножини наборів даних

dataset(name: 'validation-rules', dataset: [
    'name not too long' => ['name', fn() => getLongName(), fn() => __(key: 'validation.custom.name.max')],
]);
  • name not too long є необов'язковим людським ім'ям набору даних. Я використовую його, тому що для поліпшення читабельності виведення cli.
  • validation-rules – це ім'я набору даних.
  • fn() => getLongName() Рекомендується використовувати функцію закриття, коли ви отримуєте дані, які включають обчислення або базу даних.
  • __(key: 'validation.custom.name.max')коротка функція Laravel для отримання перекладу. Це гарантує, що ви перевіряєте, чи повернуто користувачеві правильне повідомлення.

Налаштування повідомлень перевірки Хоча налаштування повідомлень про помилки не є обов'язковим, як UI/UX дизайнер, я розумію необхідність чітких, стислих та корисних повідомлень

про помилки.

висновок Набори

даних про шкідників є відмінним інструментом для тестування правил перевірки Laravel. Я сподіваюся, що ви дещо дізналися про правила перевірки тестування. Ви можете отримати вихідний код цього посібника з мого сховища GitHub

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297