Метод make
Метод make класса Factory применяется для создания экземпляров моделей с заполненными атрибутами, определёнными в фабрике, но без сохранения их в базу данных. Этот метод полезен для тестирования, когда необходимо создать объект модели для проверки логики, но не требуется его физическое присутствие в базе данных. Первым параметром можно передать массив переопределяющих атрибутов, вторым параметром - количество создаваемых экземпляров.
Синтаксис
<?php
Model::factory()->make($attributes = [], $count = null);
?>
Пример
Давайте создадим модель пользователя с помощью фабрики без сохранения в базу данных:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_creation_without_saving()
{
$user = User::factory()->make();
$this->assertInstanceOf(User::class, $user);
$this->assertNotNull($user->name);
$this->assertNotNull($user->email);
}
}
?>
Пример
Давайте создадим модель с переопределением конкретных полей:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_user_with_overridden_attributes()
{
$user = User::factory()->make([
'name' => 'John Doe',
'email' => 'john@example.com'
]);
echo $user->name;
echo $user->email;
}
}
?>
Результат выполнения кода:
"John Doe"
"john@example.com"
Пример
Давайте создадим несколько моделей без сохранения в базу данных:
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_multiple_users_creation()
{
$users = User::factory()->count(3)->make();
echo count($users);
}
}
?>
Результат выполнения кода:
"3"
Пример
Давайте используем метод make в сочетании с состоянием фабрики для создания пользователя-администратора:
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'is_admin' => false,
];
}
public function admin()
{
return $this->state(function (array $attributes) {
return [
'is_admin' => true,
];
});
}
}
?>
<?php
namespace Tests\Unit;
use Tests\TestCase;
use App\Models\User;
class UserTest extends TestCase
{
public function test_admin_user_creation()
{
$admin = User::factory()->admin()->make();
echo $admin->is_admin;
}
}
?>
Результат выполнения кода:
"1"