15%

Alexhost 满足您的愿望

参与调查 并赢得奖品

09.10.2024
No categories

Laravel 工厂:使用 Laravel 工厂模型构建真实的测试数据

构建可靠的应用程序并实现无缝的测试和开发工作流程需要一个可靠的托管平台。 AlexHost 的 VPS 托管 为 Laravel 项目提供了理想的环境,提供完全的根访问、高性能和安全的基础设施。使用 AlexHost,您可以自信且轻松地部署您的 Laravel 应用程序并管理复杂的测试场景,例如涉及 Laravel 工厂的场景。

在使用 Laravel 开发应用程序时,测试是确保您的应用程序按预期运行的重要部分。为了使测试更有效,您需要与生产环境中运行的数据相似的真实测试数据。Laravel 工厂提供了一种简单但强大的方式,通过工厂模板创建这样的数据。工厂允许您定义模式的外观,从而快速生成测试数据。

本指南将引导您完成创建和使用 Laravel 工厂以生成真实测试数据的过程。

Laravel 中的工厂是什么?

Laravel 中的工厂是定义创建模型实例计划的类。它们特别适合生成虚假的测试数据或为数据库提供原始数据。使用工厂,您可以创建单个或多个模型实例,每个实例都有独特的属性。

工厂使用 Faker,这是一个 PHP 库,用于生成虚假数据,如姓名、地址、电子邮件等,使数据看起来更真实。

先决条件

  • Laravel 9 或更高版本。
  • 对 Eloquent 模型和 Laravel 数据库结构的基本知识。
  • 在您的 .env 文件中配置的数据库连接。

步骤 1:创建模型工厂

在 Laravel 8 及更高版本中,工厂被定义为类。您可以使用 artisan 命令创建一个新的工厂:

php artisan make:factory UserFactory

这将在 database/factories 目录中创建一个名为 UserFactory.php 的新工厂文件。

步骤 2:定义工厂

打开位于 database/factories 的 UserFactory.php 文件:

<?php
namespace DatabaseFactories;
use AppModelsUser;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'email' => $this->faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => bcrypt('password'), // or Hash::make('password')
'remember_token' => Str::random(10),
];}}

解释

  • $model:指示该工厂适用于哪个 Eloquent 模型。
  • definition():此方法返回一个定义模型的属性数组。它使用 Faker 实例 ($this->faker) 为每个属性生成随机数据。
  • name:使用 faker->name 生成一个真实的姓名。
  • email:使用 faker->unique()->safeEmail 生成一个唯一的电子邮件地址。
  • password:使用 bcrypt() 函数设置默认密码。
  • remember_token:为 remember_token 字段生成一个随机字符串。

此工厂定义将创建具有唯一电子邮件和随机姓名的真实用户凭据。

步骤 3:使用工厂创建模型实例

您可以使用工厂创建单个或多个模型实例。以下是一些示例:

3.1. 创建单个用户

要在测试或填充器中创建单个用户实例,请使用 create 方法:

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

这将在数据库中创建一个具有工厂中定义的属性的用户。

3.2. 创建多个用户

要创建多个用户实例:

$users = AppModelsUser::factory()->count(10)->create();

这将在数据库中创建 10 条用户记录。

3.3. 创建未保存的实例(Make 方法)

如果您想创建一个未保存到数据库的实例,请使用 make 方法:

$user = AppModelsUser::factory()->make();

这将创建一个 User 模型对象,但不将其保存到数据库。

步骤 4:自定义工厂状态

状态允许您定义工厂的不同版本,这对于创建具有不同角色或状态的用户非常有用。

4.1. 定义状态

您可以在工厂类中定义状态:

public function admin()
{
return $this->state(function (array $attributes) {
return [
'is_admin' => true,
];
});
}

此管理员状态可用于创建 is_admin 属性设置为 true 的用户。

4.2. 使用状态

在创建用户时使用管理员状态:

$adminUser = AppModelsUser::factory()->admin()->create();

这将创建一个 is_admin 属性设置为 true 的用户。

步骤 5:在测试中使用工厂

在编写测试时,工厂特别强大。它们允许您快速创建测试数据,并专注于您正在测试的逻辑。

5.1. 在测试用例中创建测试数据

以下是一个在测试中使用工厂的示例:

public function test_users_can_be_created()
{
$user = AppModelsUser::factory()->create();$this->assertDatabaseHas('users', [
'email' => $user->email,
]);
}

此测试创建一个用户,然后检查其是否存在于具有指定电子邮件的用户表中。

步骤 6:使用工厂填充数据库

工厂还可以在数据库填充器中使用,以填充示例数据表。

6.1. 创建填充器

使用 artisan 命令创建填充器:

php artisan make:seeder UserSeeder

打开位于 database/seeders 的 UserSeeder.php 文件,并使用工厂生成用户:

<?php
namespace DatabaseSeeders;
use AppModelsUser;
use IlluminateDatabaseSeeder;
class UserSeeder extends Seeder
{
public function run()
{
User::factory()->count(50)->create();
}
}

此填充器将使用 User 工厂创建 50 个用户。

6.2. 启动填充器

使用以下命令启动填充器:

php artisan db:seed --class=UserSeeder

此命令将用户表填充 50 条随机用户记录。

步骤 7:在工厂中使用连接

如果您有具有链接的模型,例如 User 和 Post,您可以创建生成链接数据的工厂:

7.1. 定义连接

在 PostFactory.php 中:

public function definition()
{
return [
'user_id' => AppModelsUser::factory(),
'title' => $this->faker->sentence,
'body' => $this->faker->paragraph,
];
}

此定义确保在创建帖子时,使用用户工厂自动生成一个用户。

7.2. 创建与用户关联的帖子

$post = AppModelsPost::factory()->create();

这将创建一个与之关联的用户的帖子。

结论

Laravel 工厂是生成真实测试数据的强大工具,使您的测试更加健壮,开发过程更快。使用工厂模板,您可以创建模型的变体,模拟不同的用户行为,并轻松填充数据库。了解如何使用状态、关系和用户数据生成与 Laravel 工厂将大大改善您的测试和开发工作流程。祝您编码顺利!

15%

Alexhost 满足您的愿望

参与调查 并赢得奖品

Похожие записи не найдены.