morrislaptop/popo-factory

轻松模拟POPO

v0.4.0 2022-07-12 14:54 UTC

This package is auto-updated.

Last update: 2024-08-30 01:23:30 UTC


README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

此包支持模拟POPOs或值对象,它会检查您的类属性并使用Faker生成随机数据填充它们。您可以通过创建基于类的模拟工厂来拥有流畅的接口,用于模拟不同状态下的POPO。

这是数据传输对象工厂的分支。

安装

您可以通过composer安装此包

composer require morrislaptop/popo-factory --dev

使用

use Morrislaptop\PopoFactory\PopoFactory;

class PersonData
{
    public function __construct(
        public $firstName,
        public string $lastName,
        public string $email,
        public string $homeAddress,
        public ?string $companyName,
        public string $workAddress,
        public Carbon $dob,
        public PersonData $spouse,
    ) {
    }
}

PopoFactory::new(PersonData::class)->make();

这将创建一个类似以下的对象

{
  "firstName": "Jada",
  "lastName": "Bechtelar",
  "email": "edmond.mcglynn@example.org",
  "homeAddress": "640 Feest Landing\nBernierburgh, PA 99277",
  "companyName": "Ratke Inc",
  "workAddress": "75107 Konopelski Radial\nRutherfordport, AK 22994",
  "dob": "2021-01-26T11:04:31.393991Z",
  "spouse": {
    "firstName": "Leola",
    "lastName": "Koss",
    "email": "friedrich41@example.org",
    "homeAddress": "852 Fabian Mills\nNorth Ward, NM 54459",
    "companyName": "Fahey and Sons",
    "workAddress": "671 Creola Prairie Apt. 663\nNorth Gretchenview, OR 75622-4176"
  }
}

new方法返回一个Morrislaptop\PopoFactory\PopoFactory的实例,它提供以下方法。

  • count() - 允许您指定要生成的POPO数量。它们将以数组的形式返回。
  • make() - 当您准备好生成POPO时调用。返回生成的对象。
  • random() - 生成随机数量的POPO。
  • sequence() - 交替特定状态。(见下文)
  • state() - 根据传递的值数组手动设置属性。

这些方法的示例如下。

// Creates two DTOs in an array
PopoFactory::new(PersonData::class)->count(2)->make();

// Sets the first name of every person to "Jim"
PopoFactory::new(PersonData::class)
    ->random()
    ->state([
        'firstName' => 'Jim',
    ])
    ->make();

// Alternates the names of each person between "Jim" and "Susie"
PopoFactory::new(PersonData::class)
    ->random()
    ->sequence(
        [ 'firstName' => 'Jim' ],
        [ 'firstName' => 'Susie' ]
    )
    ->make();

创建基于类的工厂

为特定对象定义特定的工厂非常有用,这可以通过扩展PopoFactory类轻松完成。

通过指定make()方法的类型提示,您还可以在IDE中为您的模拟对象获得类型提示。

/**
 * @method PersonData make
 */
class PersonDataFactory extends PopoFactory
{
    public static function factory(): static
    {
        return static::new(PersonData::class)->state([
            'firstName' => 'Craig'
        ]);
    }

    public function gotNoJob() {
        return $this->state([
            'companyName' => null,
        ]);
    }

    public function worksAtHome() {
        return $this->state(function ($attributes) {
            return [
                'workAddress' => $attributes['homeAddress']
            ];
        });
    }
}

然后在测试中使用它,如下所示

$person = PersonDataFactory::factory()
            ->gotNoJob()
            ->worksAtHome()
            ->make();

扩展

您可以通过扩展工厂来轻松支持其他数据类型。您可以通过在PropertyFactory类上的静态registerProvider()方法上完成此操作。此方法接受两个参数。第一个应该是您提供的类的FQDN(例如,Carbon\Carbon)或内置类型(例如,string)。第二个应该是一个回调,该回调返回生成的值。当调用时,此回调会传递两个属性以协助生成值。第一个是Anteris\FakerMap\FakerMap的实例,可用于帮助生成假数据。第二个是包含有关正在生成的属性信息的ReflectionProperty实例。

例如,要支持Carbon

use Morrislaptop\PopoFactory\PropertyFactory;

use Anteris\FakerMap\FakerMap;

PropertyFactory::registerProvider('Carbon\Carbon', fn(FakerMap $fakerMap) => Carbon::parse(
    $fakerMap->closest('dateTime')->fake()
));

插件

想要一个轻松在Laravel中持久化POPOs的方法?查看laravel-popo-caster

测试

composer test

变更日志

请参阅变更日志以获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全漏洞

请参阅我们的安全策略以了解如何报告安全漏洞。

鸣谢

许可

MIT许可(MIT)。请参阅许可文件以获取更多信息。