morrislaptop / popo-factory
轻松模拟POPO
v0.4.0
2022-07-12 14:54 UTC
Requires
- php: ^8.0
- anteris-dev/faker-map: ^2.0
- fakerphp/faker: ^1.13
- symfony/property-access: ^5.2 || ^6.0
- symfony/property-info: ^5.2 || ^6.0
- symfony/serializer: ^5.2 || ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.17
- nesbot/carbon: ^2.43
- phpunit/phpunit: ^9.5
- spatie/ray: ^1.16
- vimeo/psalm: ^4.3
README
此包支持模拟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)。请参阅许可文件以获取更多信息。