matthewpatterson / carpenter
一个用于使用测试数据的数据库模型设置库
Requires
- doctrine/annotations: 1.2.*@stable
- symfony/finder: 2.5.*@stable
Requires (Dev)
- apigen/apigen: 2.8.*@stable
- doctrine/orm: *
- phpunit/phpunit: 4.2.*@stable
- squizlabs/php_codesniffer: 1.5.*@stable
This package is not auto-updated.
Last update: 2020-02-03 03:57:42 UTC
README
一个受 FactoryGirl 极大启发的 PHP 库,用于设置数据库固定数据。
安装
将以下内容添加到 composer.json
文件中
{ "require": { "matthewpatterson/carpenter": "*" } }
然后,运行 composer install
。
用法
定义工厂
工厂是自由形式的类,允许在定义中具有很大的灵活性。使一个类成为工厂只需使用 @Factory
注解。例如,考虑以下实际上不会做很多事情的工厂
<?php use Carpenter\Annotation\Factory; /** @Factory("stdclass") */ class BoringFactory { }
工厂可以存在于代码库的任何地方。然而,在使用之前,您需要调用 Carpenter\Factory::discoverFactories()
,例如在测试引导脚本中。
使用工厂
有两种方式可以使用工厂:build()
和 create()
。两者都将为您提供一个所需固定件的实例;区别在于 create()
将还将固定件持久化到数据存储中。
在调用 build()
或 create()
时,您至少需要提供要使用的工厂的名称。工厂的名称是从工厂的不合格类名派生出来的。例如,\Project\Fixture\UserFactory
变为 User
。
<?php $user = Carpenter\Factory::build('User'); $persistedUser = Carpenter\Factory::create('User');
基本工厂
您可以使用工厂做的最基本的事情是使用静态值定义属性。简单定义一个公共实例属性,每个固定件都将具有您分配给它的值。
<?php use Carpenter\Annotation\Factory; /** @Factory("\Project\Model\User") */ class UserFactory { public $firstName = "John"; public $lastName = "Doe"; public $email = "john.doe@example.com"; public $status = "new"; } $user = Carpenter\Factory::build('User'); $user->firstName == "John"; // true $user->lastName == "Doe"; // true $user->email == "john.doe@example.com"; // true $user->status == "new"; // true
覆盖属性
尽管 UserFactory
很好,但如果我们想让我们的用户拥有稍微不同的状态怎么办?您可以在构建和创建固定件时提供一个覆盖数组。
<?php $user = Carpenter\Factory::build("User", ["status" => "verified"]); $user->firstName == "John"; // etc. $user->status == "verified"; // true
动态属性
属性值也可以动态生成,这使得使用像 Faker 这样的工具生成随机数据变得容易。您只需要一个公共实例属性和具有相同名称的公共实例方法。当然,如果需要,您还可以提供覆盖值。
<?php use Carpenter\Annotation\Factory; /** @Factory("\Project\Model\User") */ class UserFactory { public $firstName; public function firstName() { $faker = Faker\Factory::create(); return $faker->firstName; } } $user = Carpenter\Factory::build('User'); $user->firstName == "Quincy"; $user = Carpenter\Factory::build('User', ["firstName" => "George"]); $user->firstName == "George";
修饰符
修饰符(类似于 FactoryGirl 特性)定义了一组属性,特别适用于复杂领域模型。要创建修饰符,只需将 @Modifier
注解添加到公共实例方法中。修饰符通过修改类的实例来起作用。当调用 build()
或 create()
时,您可以指定修饰符,它们将按顺序应用。
<?php use Carpenter\Annotation\Factory; use Carpenter\Annotation\Modifier; /** @Factory("\Project\Model\User") */ class UserFactory { public $admin = false; public $roles = []; /** @Modifier */ public function admin() { $this->admin = true; $this->roles = Roles::getAll(); } /** @Modifier */ public function moderator() { $this->roles = ['delete_posts', 'edit_posts', 'ban_users']; } } $adminUser = Carpenter\Factory::build('User', 'admin'); $moderatorUser = Carpenter\Factory::build('User', 'admin', 'moderator'); // Will have $admin == true but the roles of a moderator $otherModerator = Carpenter\Factory::build('User', 'admin', ["roles" => ["ban_users"]]); // Will have $admin == true but only the ban_users role
适配器
适配器构建正确的夹具并将其持久化到数据存储中。目前,有两个适配器可用
- ArrayAdapter
- DoctrineAdapter
配置
在开始使用Carpenter之前,应设置以下值。例如,您可以在测试引导脚本中这样做。
Carpenter\Configuration::$adapter
- 用于构建夹具的适配器Carpenter\Configuration::$factoryPaths
- 要搜索工厂的路径数组
贡献
该项目处于非常初期的阶段。因此,通过Github接受pull requests和issue。