chustilla/cakephp-model-factory

一个用于快速创建模型以便测试的工具,灵感来源于Laravel Model Factory。

1.2.0 2020-06-21 15:29 UTC

This package is not auto-updated.

Last update: 2024-09-22 13:41:56 UTC


README

一个用于快速创建模型以便测试的工具,灵感来源于Laravel Model Factory。

要求

  • PHP >=7.2

安装

通过Composer

$ composer install chustilla/cakephp-model-factory

使用方法

定义工厂

通过模型定义,您将告诉工厂如何用数据填充实体。

一个模型定义的例子可能会是...

# database/factories/BarFactory.php

<?php

use App\Model\Entity\Bar;

$factory->define(Bar::class, [
    'id' => 123,
    'name' => 'Guybrush Threepwood',
]);

这是一个不寻常的模型定义,因为它会使用相同的数据创建所有实体实例。通常,您需要计算数据或使用Faker库来生成假数据,在这种情况下,您可以使用闭包来定义模型属性

<?php

use App\Model\Entity\Bar;
use Faker\Generator as Faker;

$factory->define(Bar::class, function (Faker $faker) {
    return [
        'id' =>  $faker->numberBetween(1, 1000),
        'name' => $faker->name,
    ];
});

加载模型定义

为了从其定义中创建模型,您需要加载这些定义。一个加载模型定义的好地方是测试引导文件,通过指定模型定义目录的路径。

# tests/bootstrap.php

<?php

use Chustilla\ModelFactory\Factory;

Factory::getInstance()->loadFactories('absolute/or/relative/path/to/models/definitions/directory');

创建模型

为了便于模型创建,库提供了factory()辅助函数

# tests/TestCase/Unit/Service/FooServiceTest.php

<?php

use Cake\TestSuite\TestCase;

class FooServiceTest extends TestCase
{
    public function testMethod()
    {
        // Arrange
        $bar = factory(Bar::class)->create();
        ...
    }
}

这将创建一个完全填充的实体并将其保存到为测试定义的数据源中。如果您不需要持久化数据,您可以使用make()方法

$bar = factory(Bar::class)->make();

您也可以通过传递给辅助函数的模型数量来创建多个模型的数组

$bar = factory(Bar::class, 3)->create();

覆盖模型定义数据

通过传递一个属性数组给create()make()函数,您可以覆盖由模型定义填充的数据

$bar = factory(Bar::class)->make(['id' => 1, 'name' => 'LeChuck']);

状态

通过状态,您可以定义模型属性的离散修改。

<?php

use App\Model\Entity\Bar;
use App\Model\Entity\Foo;
use Faker\Generator as Faker;

$factory->define(Bar::class, function (Faker $faker) {
    return [
        'id' =>  $faker->numberBetween(1, 1000),
        'name' => $faker->name,
    ];
});

$factory->state(Bar::class, 'withFoo', function () {
    return [
        foo => factory(Foo::class)->create(),
    ];
});

对于定义,您可以通过闭包或简单的数组来定义状态属性

以下是如何在模型构建期间应用状态。允许状态组合。

$bar = factory(Bar::class)->states['withFoo', 'active']->create();

删除模型

为了确保测试隔离,删除每个测试存储的模型非常重要。库提供了一个特性,可以为您完成这项工作。

# tests/TestCase/Unit/Service/FooServiceTest.php

<?php

use Cake\TestSuite\TestCase;
use Chustilla\ModelFactory\DatabaseCleanUp;

class FooServiceTest extends TestCase
{
    use DatabaseCleanUp;

    public function testMethod()
    {
        // Arrange
        $bar = factory(Bar::class)->create();
        ...
    }
}

许可

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