chustilla / cakephp-model-factory
一个用于快速创建模型以便测试的工具,灵感来源于Laravel Model Factory。
1.2.0
2020-06-21 15:29 UTC
Requires
- cakephp/cakephp: ~3.7
- league/factory-muffin: ~2.0
- symfony/finder: >=4.0
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)。请参阅许可证文件获取更多信息。