Передумови
У цьому посібнику ми перевіримо правила перевірки для реєстрації користувачів. Однак концепція застосовується і до інших сценаріїв. Я припускаю, що:
- Ви знаєте, як налаштувати додаток Laravel. Якщо ні, ви можете звернутися до офіційної документації Laravel
- Ви знайомі з фреймворком тестування Pest PHP. Якщо ні, зверніться до документації Pest PHP..
Навіщо перевіряти правила валідації?
- Щоб переконатися, що правила перевірки працюють належним чином. Тестування гарантує, що ваша програма не приймає недійсні дані, що може мати наслідки для безпеки або продуктивності.
- Для виявлення помилок у правилах перевірки. За допомогою тестів ви можете виявити помилки досить рано і запобігти їх проблеми на виробництві.
- Щоб покращити якість коду. Коли ви тестуєте свої правила валідації, ви змушені думати про те, як вони працюють і як їх слід тестувати.
Тестування реєстрації
користувачів Оновіть свій 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"
Результат повинен виглядати так:
Пояснення
коду Про 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