robier/forge-object

dev-master 2019-05-16 22:53 UTC

This package is auto-updated.

Last update: 2024-09-17 11:28:13 UTC


README

Build Status Mutation score PHPStan MIT

轻松为测试目的构建自己的对象(不适用于生产代码)。

深受Laravel的工厂模式启发,但有一个重大区别,Laravel的工厂模式仅用于创建或持久化模型,但这个库可以创建任何类型的对象(模型、实体、值对象等)。这个库不知道如何持久化东西。

库与框架无关,可以集成在任何框架中。

每个测试有3个主要部分

  • setup - 设置测试应用程序
  • test - 实际断言
  • cleanup - 删除代码或数据库中的引用

这个库旨在减少测试的设置部分,并减少向对象添加新数据所需的时间,尤其是在你的测试中频繁使用该对象时。

如果你希望在这个库中看到某些功能,请随时贡献或提出问题 :)

安装

可以通过composer安装库

composer require --dev robier/forge-object

用法

首先你需要为你的对象注册forge

$manager = new Robier\ForgeObject\Manager();
$manager->register(\stdClass::class, static function(): \stdClass{
    // apply random valid data to object
    $object = new \stdClass();
    $object->active = (bool)rand(0, 1);
    $object->admin = (bool)rand(0, 1);
    
    return $object;
})

注册后,你可以向对象添加状态

$manager->registerState(\stdClass::class, 'active', static function(\stdClass $item): void{
    // change random data with exact data in states
    $item->active = true;
})

$manager->registerState(\stdClass::class, 'admin', static function(\stdClass $item): void{
    // change random data with exact data in states
    $item->admin = true;
})

假设你需要在测试中有一个随机的stdClass对象

$oneStdClassObject = $manager->new(\stdClass::class)->one();

或者你需要一个活跃的随机stdClass

$oneStdClassObject = $manager->new(\stdClass::class)->state('active')->one();

也许你需要多个活跃的随机stdClass对象,比如15个

$manyActiveStdClassObjects = $manager->new(\stdClass::class)->state('active')->many(15);

状态可以组合,并且它们按照提供给state方法的顺序应用。如果你想得到一个既是活跃又是管理员的随机stdClass,你可以这样做

$oneStdClassObject = $manager->new(\stdClass::class)->state('active', 'admin')->one();

本地开发

使用以下命令构建docker

docker/build

在docker内运行任何命令

docker/run {script}

例如

docker/run composer install

运行所有测试

docker/run composer run test