matthewpatterson/carpenter

此包已被废弃且不再维护。未建议替代包。

一个用于使用测试数据的数据库模型设置库

0.1 2014-11-08 07:31 UTC

This package is not auto-updated.

Last update: 2020-02-03 03:57:42 UTC


README

一个受 FactoryGirl 极大启发的 PHP 库,用于设置数据库固定数据。

Build Status Analytics

安装

将以下内容添加到 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。