invertus/prestashop-models

此包提供测试数据库驱动应用程序的能力。模型工厂使得使用 Prestashop 模型创建测试数据库记录更加容易。

1.0.4 2023-09-08 12:25 UTC

This package is auto-updated.

Last update: 2024-09-08 14:26:11 UTC


README

此包提供测试数据库驱动应用程序的能力。模型工厂使得使用 Prestashop 模型创建测试数据库记录更加容易。

安装

使用 composer 需要此包。建议仅将包用于开发。

composer require invertus/prestashop-models --dev

定义模型工厂

概念概述

在测试时,您可能需要在执行测试之前将一些记录插入到数据库中。在创建测试数据时,您不必手动指定每个列的值,此包允许您使用模型工厂为每个 Prestashop 模型定义一组默认属性。

要查看如何编写工厂的示例,请查看您应用程序中的 tests/Factories/Models/UserFactory.php 文件。

namespace Tests\Factories\Models;

use Invertus\Prestashop\Models\Factory\Factory;
use Customer;

class CustomerFactory extends Factory
{
    protected $model = Customer::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name(),
            'email' => $this->faker->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        ];
    }
}

`

如你所见,在最基本的形式中,工厂是扩展此包的基工厂类的类,并定义 definition 方法。该 definition 方法返回在创建模型时应应用的默认属性值集。

通过 faker 属性,工厂可以访问 Faker PHP 库,允许您方便地生成各种类型的随机数据以进行测试。

{提示} 您可以通过在工厂类中重写 withFaker() 函数来覆盖 faker。

生成工厂

要创建工厂,执行 make:factory

php vendor/bin/prestashop-models make:factory ProductFactory

要创建具有不同于 {model}Factory 的特定名称的工厂,请执行此命令

php vendor/bin/prestashop-models make:factory TestProductFactory --model="\Product" 

--model 应具有完整的模型命名空间。

新的工厂类将放置在您的 tests/Factories/Models 目录中。

工厂状态

状态操作方法允许您定义可以应用于模型工厂的离散修改,可以组合使用。例如,您的 Tests\Factories\Models\CustomerFactory 工厂可能包含一个 suspended 状态方法,该方法修改其默认属性值之一。

状态转换方法通常调用由包的基工厂类提供的 state 方法。该 state 方法接受一个闭包,该闭包将接收为工厂定义的原始属性数组,并应返回要修改的属性数组。

/**
 * Indicate that the customer is suspended.
 *
 * @return self
 */
public function suspended()
{
    return $this->state(function (array $attributes) {
        return [
            'account_status' => 'suspended',
        ];
    });
}

工厂回调

使用 afterMakingafterCreating 方法注册工厂回调,允许您在创建或创建模型后执行其他任务。您应通过在工厂类上定义 configure 方法来注册这些回调。此方法将由 Laravel 在实例化工厂时自动调用。

namespace Tests\Factories\Models;

use Invertus\Prestashop\Models\Factory\Factory;
use Customer;

class CustomerFactory extends Factory
{
    /**
     * Configure the model factory.
     *
     * @return $this
     */
    public function configure()
    {
        return $this->afterMaking(function (Customer $customer) {
            //
        })->afterCreating(function (Customer $customer) {
            //
        });
    }

    // ...
}

使用工厂创建模型

实例化模型

一旦您已定义了工厂,您可以使用由 Illuminate\Database\Eloquent\Factories\HasFactory 特性提供的模型提供的静态 factory 方法来为该模型实例化工厂实例。让我们看看创建模型的几个例子。首先,我们将使用 make 方法创建不将模型持久化到数据库的模型。

use Tests\Factories\Models\CustomerFactory;

public function test_models_can_be_instantiated()
{
    $customer = CustomerFactory::initialize()->make();

    // Use model in tests...
}

您可以使用 count 方法创建许多模型的集合。

$customers = CustomerFactory::initialize()->count(3)->make();

应用状态

您还可以将任何状态应用到模型上。如果您想将多个状态转换应用到模型上,您可以直接调用状态转换方法。

$customers = CustomerFactory::initialize()->count(5)->suspended()->make();

覆盖属性

如果您想覆盖模型的一些默认值,您可以将值数组传递给 make 方法。只有指定的属性将被替换,其余属性将保持为工厂指定的默认值。

$customer = CustomerFactory::initialize()->make([
    'name' => 'Abigail Otwell',
]);

持久化模型

create 方法实例化模型实例,并使用模型的 save 方法将它们持久化到数据库中

use Tests\Factories\Models\CustomerFactory;

public function test_models_can_be_persisted()
{
    // Create a single App\Models\User instance...
    $customer = CustomerFactory::initialize()->create();

    // Create three App\Models\User instances...
    $customers = CustomerFactory::initialize()->count(3)->create();

    // Use model in tests...
}

您可以通过向 create 方法传递一个属性数组来覆盖工厂的默认模型属性

$customer = CustomerFactory::initialize()->create([
    'name' => 'Abigail',
]);