apinstein / fixturenator
PHP 的基于工厂的测试数据生成器。
dev-master
2017-12-28 00:28 UTC
Requires
- php: >=5.3.0
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 实现!