Метод state
Метод state применяется к фабрике модели
и позволяет задавать альтернативные наборы атрибутов
для разных состояний. Первым параметром передаётся
название состояния, вторым - массив или замыкание
с атрибутами. Метод возвращает экземпляр фабрики
с применённым состоянием.
Синтаксис
<?php
use AppModelsUser;
User::factory()->state('admin', [
'role' => 'admin',
'is_active' => true
]);
?>
Пример
Давайте определим состояние 'admin' для модели User:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'role' => 'user',
'is_active' => true
];
}
public function admin()
{
return $this->state([
'role' => 'admin',
'is_active' => true
]);
}
}
?>
Пример
Создадим пользователя с состоянием 'admin' в тесте:
<?php
namespace TestsUnit;
use TestsTestCase;
use AppModelsUser;
use IlluminateFoundationTestingRefreshDatabase;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_admin_user_creation()
{
$user = User::factory()
->admin()
->create();
$this->assertEquals('admin', $user->role);
}
}
?>
Результат выполнения кода:
"User created with admin role"
Пример
Используем замыкание для динамического определения состояния:
<?php
namespace DatabaseFactories;
use AppModelsPost;
use IlluminateDatabaseEloquentFactoriesFactory;
class PostFactory extends Factory
{
protected $model = Post::class;
public function definition()
{
return [
'title' => $this->faker->sentence,
'content' => $this->faker->paragraph,
'published' => false
];
}
public function published()
{
return $this->state(function (array $attributes) {
return [
'published' => true,
'published_at' => now()
];
});
}
}
?>
Пример
Применим состояние 'published' при создании поста:
<?php
namespace TestsUnit;
use TestsTestCase;
use AppModelsPost;
use IlluminateFoundationTestingRefreshDatabase;
class PostTest extends TestCase
{
use RefreshDatabase;
public function test_published_post_creation()
{
$post = Post::factory()
->published()
->create();
$this->assertTrue($post->published);
$this->assertNotNull($post->published_at);
}
}
?>
Результат выполнения кода:
"Post created and published successfully"
Пример
Комбинируем несколько состояний для создания сложных сценариев:
<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'role' => 'user',
'is_active' => true,
'verified' => false
];
}
public function admin()
{
return $this->state([
'role' => 'admin'
]);
}
public function inactive()
{
return $this->state([
'is_active' => false
]);
}
public function verified()
{
return $this->state([
'verified' => true,
'email_verified_at' => now()
]);
}
}
?>
Пример
Применим сразу несколько состояний к одной фабрике:
<?php
namespace TestsUnit;
use TestsTestCase;
use AppModelsUser;
use IlluminateFoundationTestingRefreshDatabase;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_inactive_verified_admin_creation()
{
$user = User::factory()
->admin()
->inactive()
->verified()
->create();
$this->assertEquals('admin', $user->role);
$this->assertFalse($user->is_active);
$this->assertTrue($user->verified);
}
}
?>
Результат выполнения кода:
"Custom user created with multiple states"
Смотрите также
-
метод
definition,
который определяет базовые атрибуты фабрики -
метод
create,
который создаёт и сохраняет модель в базе данных -
метод
make,
который создаёт модель без сохранения в базу -
метод
sequence,
который определяет последовательность атрибутов