Laracode
Laracode

Проверка отсутствия модели

При написании тестов мы часто используем assertDatabaseMissing, чтобы проверить, была ли модель удалена. Знали ли вы, что в Laravel есть удобный хелпер assertModelMissing, который делает то же самое, но проще?

<?php

use App\Models\User;

$user = User::factory()->create();

$user->delete();

// Вместо этого 🥱
$this->assertDatabaseMissing('users', [
    'email' => $user->email
]);

// Можно сделать так 😎
$this->assertModelMissing($user);

Повторное использование существующих моделей

При создании фабрик вы можете использовать одну и ту же модель для всех связей вместо создания новой модели для каждой. В Laravel для этого есть удобный метод recycle.

<?php

$airlines = Airline::factory()->count(3)->create();

// Для 100 билетов будут использоваться только 3 авиакомпании
Ticket::factory()
    ->count(100)
    ->recycle($airlines) // Вы также можете передать только одну модель
    ->create();

FakerPHP - случайный элемент

Иногда при определении фабрик вам может понадобиться выбрать случайный элемент из массива. Поскольку Laravel под капотом использует FakerPHP, вы можете сделать это, вызвав метод randomElement.

<?php

// Получить случайный тип подписки
$random = fake()->randomElement(['basic', 'premium']);

// Получить случайную букву
$random = fake()->randomElement(['a', 'b', 'c']);

Тестирование очередей

В Laravel 11 появилась новая возможность тестировать неудавшиеся, повторно запущенные или удалённые задачи очереди, что было затруднительно в предыдущих версиях! Теперь вы можете просто вызвать метод withFakeQueueInteractions у своей задачи (job) и проверить одно из перечисленных действий.

<?php

use App\Jobs\ProcessPodcast;

$job = (new ProcessPodcast)->withFakeQueueInteractions();

$job->handle();

$job->assertReleased(delay: 30);
$job->assertDeleted();
$job->assertNotDeleted();
$job->assertFailed();
$job->assertNotFailed();

Опциональные значения в тестах при помощи Faker

Если у вас есть столбцы в таблице, которые не являются обязательными, и вы хотите генерировать для них значения случайным образом, FakerPHP (используемый в Laravel под капотом) изначально поддерживает опциональные значения 🚀

<?php

// случайная цифра или null
fake()->optional()->randomDigit();

// шанс 90% получить NULL
fake()->optional($weight = 0.1)->randomDigit();

// шанс 10% получить NULL
fake()->optional($weight = 0.9)->randomDigit();

// шанс 90%  получить NULL
fake()->optional($weight = 10)->randomDigit;

// шанс 0% получить NULL
fake()->optional($weight = 100)->randomDigit;

// шанс 50% получить FALSE
fake()->optional($weight = 0.5, $default = false)->randomDigit();

// шанс 10% получить 'abc'
fake()->optional($weight = 0.9, $default = 'abc')->word();