apinstein/fixturenator

PHP 的基于工厂的测试数据生成器。

dev-master 2017-12-28 00:28 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:53:19 UTC


README

Fixturenator 是一个受 factory_girl 启发的工厂式测试数据生成器,精心移植到 PHP。

下载 / 安装

pear install apinstein.pearfarm.org/fixturenator

require 'fixturenator/Fixturenator.php';

源代码 在 GitHub 上可用。

为什么使用工厂模式?

有许多为测试准备测试数据的模式,但根据我的经验,它们在维护或创建的简便性方面都存在问题。

工厂模式提供了一种 DRY(Don't Repeat Yourself)的方式来指定对象的基本有效数据,然后将其作为原型重用以创建类似的对象。

结果是,当你向模型对象添加列或更改验证器时,测试数据生成不会在 1000 个地方中断。修复核心工厂定义,所有测试就又能正常工作了!

用法

每个工厂都通过一个名称和创建对象的一些默认数据来识别。

// Static data for each instance        
Fixturenator::define('User', array('username' => 'joe'));

// Closure-passing syntax on 5.3
Fixturenator::define('User', function($factory) {
  $factory->username = 'joe';
});

// Closure-passing syntax on 5.2
Fixturenator::define('User', create_function('$factory', '
  $factory->username = 'joe';
'});

建议您为每个类创建一个工厂,该工厂提供该类所需的最小有效数据。可以通过继承创建额外的工厂,以轻松创建常见场景数据。

工厂名称必须是唯一的。

使用工厂

根据工厂创建数据主要有四种方法

  • create - 创建一个新的未保存实例
  • saved - 与 create 相同,但调用定义的保存方法(默认为 'save')
  • stub - 创建一个 MagicArray 实例,以方便进行存根功能
  • asArray - 一个包含所有数据值的 PHP 数组(哈希)

示例

// Returns an unsaved User instance
$user = Fixturenator::create('User');

// Customer the generated object
$user = Fixturenator::create('User', array('password' => '1234'));

// returns a "saved" User object, as if you called $user->save($dbCon)
$user = Fixturenator::saved('User', array(), $dbCon);

动态生成属性

您可能需要在每次运行时动态生成一些数据

// the 'return ...' gets turned into a lambda; on 5.3 you can pass true lambda    
$user = Fixturenator::create('User', array('password' => 'return rand(1000,9999);'));

// Generate one attribute based on others
$user = Fixturenator::create('User', array('email' => 'return "{$o->username}@domain.com";'));

序列

序列在生成唯一且可预测的数据时非常有用

Fixturenator::createSequence('username', 'return "username{$n}";');
Fixturenator::getSequence('username')->next();    // => username1
Fixturenator::getSequence('username')->next();    // => username2

您可以在定义中使用这些序列,如下所示

Fixturenator::define(TestObject, array(
    'username' => new FixturenatorSequence('return "username{$n}";')
));
Fixturenator::define(TestObject, array(
    'username' => 'return Fixturenator::getSequence('username')->next()'
));

感谢

感谢 factory_girl 团队对工厂模式的研究和时间投入,以及出色的 factory_girl 实现!