sizuhiko / fabricate
PHP测试数据生成器
Requires
- fzaninotto/faker: ~1.4
Requires (Dev)
- phpunit/phpunit: ^4.8.35 || ^5.7 || ^6.0
Suggests
- sizuhiko/cake_fabricate: for integration with CakePHP3
This package is auto-updated.
Last update: 2024-09-06 16:47:52 UTC
README
Fabricate
PHP测试数据生成器
它受到了Ruby世界中的Fabrication和factory-girl的启发。
Fabricate是一个简单的PHP模拟对象生成核心库。在您的应用或测试用例的任何地方快速生成所需的对象。
如果您使用CakePHP2,请参阅cakephp2分支。
安装
在composer.json中添加require-dev
composer require --dev sizuhiko/fabricate
用法
适配器
首先,Fabricate需要配置才能使用。例如,要覆盖这些设置,请在您的应用文件夹中放置一个bootstrap.php,并将其路径追加到phpunit.xml
use Fabricate\Fabricate; use CakeFabricate\Adaptor\CakeFabricateAdaptor; Fabricate::config(function($config) { $config->adaptor = new CakeFabricateAdaptor(); });
Fabricate不提供适配器。如果您将创建任何框架的适配器,请将您的pull request发送给我们。pull request将包括composer.json中的建议和README上的仓库链接(社区适配器)。
社区适配器
基础知识
生成对象的简单方法
Fabricate::create('Post')
这将使用模式信息生成并保存Post的实例。
要设置额外的属性或覆盖Fabricator中的内容,您可以向Fabricate传递一个包含您想要设置的字段的数组。
Fabricate::create('Post', ["created" => "2013-10-09 12:40:28", "updated" => "2013-10-09 12:40:28"])
使用块生成
除了数组之外,您还可以向Fabricate传递一个回调函数,在对象生成时,Fabricator定义的所有功能都可供您使用。
Fabricate::create('Post', 10, function($data){ return ["created" => "2013-10-09 12:40:28", "updated" => "2013-10-09 12:40:28"]; });
该哈希将覆盖回调函数中定义的任何字段。
API
配置
要覆盖这些设置,请在您的应用文件夹中放置一个bootstrap.php,并将其路径追加到phpunit.xml
Fabricate::config(function($config) {
$config->sequence_start = 1;
$config->adaptor = new Fabricate\Adaptor\CakePHPAdaptor();
$config->faker = \Faker\Factory::create('ja_JP');
});
支持选项
sequence_start
允许您指定所有序列的默认起始数字。这仍然可以覆盖特定序列。
默认值:1
adaptor
适配器通过ORM库(或框架)提供的Database访问器简化了数据库的填充。
默认值:null
faker
允许您指定默认的Faker实例以返回本地化数据。
默认值:默认地区(en_EN)实例
text_size_limit
允许您指定文本字段的生成大小限制。
默认值:200
从v1.2.3开始
生成模型属性作为数组(不保存)
Fabricate::attributes_for(:model_name, :number_of_generation, :array_or_callback)
仅生成属性。
- model_name: 模型类名。
- number_of_generation: 生成的记录数
- array_or_callback: 可以覆盖每个生成的属性
示例
$results = Fabricate::attributes_for('Post', 10, function($data){ return ["created" => "2013-10-09 12:40:28", "updated" => "2013-10-09 12:40:28"]; }); // $results is followings : array ( 0 => array ( 'id' => 1, 'title' => 'Lorem ipsum dolor sit amet', 'body' => 'Lorem ipsum dolor sit amet, aliquet feugiat. Convallis morbi fringilla gravida, phasellus feugiat dapibus velit nunc, pulvinar eget sollicitudin venenatis cum nullam, vivamus ut a sed, mollitia lectus. Nulla vestibulum massa neque ut et, id hendrerit sit, feugiat in taciti enim proin nibh, tempor dignissim, rhoncus duis vestibulum nunc mattis convallis.', 'created' => '2013-10-09 12:40:28', 'updated' => '2013-10-09 12:40:28', ), 1 => array ( ....
生成模型实例(不保存)
Fabricate::build(:model_name, :array_or_callback)
生成模型实例(使用ClassRegistry::init)。
- model_name: 模型类名。
- array_or_callback: 可以覆盖每个生成的属性
示例
$result = Fabricate::build('Post', function($data){ return ["created" => "2013-10-09 12:40:28", "updated" => "2013-10-09 12:40:28"]; }); // $results are depends adaptor result. ......
生成记录到数据库
Fabricate::create(:model_name, :number_of_generation, :array_or_callback)
生成并保存记录到数据库。
- model_name: 模型类名。
- number_of_generation: 生成的记录数
- array_or_callback: 可以覆盖每个生成的属性
示例
Fabricate::create('Post', 10, function($data){ return ["created" => "2013-10-09 12:40:28", "updated" => "2013-10-09 12:40:28"]; });
定义
Fabricate在生成对象时有一个名称和一组属性。默认情况下,名称用于猜测对象的类,
Fabricate::define('Post', ['published'=>'1']); // or using callback block Fabricate::define('Post', function($data, $world) { return ['published'=>'1'] });
要使用与类不同的名称,您必须在第一个参数的数组中指定'class'=>:class_name。
Fabricate::define(['PublishedPost', 'class'=>'Post'], ['published'=>'1']); Fabricate::create('PublishedPost');
您可以使用'parent'键从其他定义的属性集中继承属性。
Fabricate::define(['PublishedPost', 'class'=>'Post'], ['published'=>'1']); Fabricate::define(['Author5PublishedPost', 'parent'=>'PublishedPost'], ['author_id'=>'5']); Fabricate::create('Author5PublishedPost');
关联
在Fabricate::create()中可以设置关联(hasOne/hasMany/belongsTo)。您还可以指定FabricateContext::association()。它将生成属性,并将其(合并)设置在当前数组中。
用法
Fabricate::create('User', function($data, $world) { return [ 'user' => 'taro', 'Post' => $world->association('Post', 3), ]; }); // or can overwritten by array or callback block. Fabricate::create('User', function($data, $world) { return [ 'user' => 'taro', 'Post' => $world->association('Post', 3, function($data, $world) { return ['title'=>$world->sequence('Post.title',function($i){ return "Title-${i}"; })]; }), ]; }); // can use defined onbject. Fabricate::define(['PublishedPost', 'class'=>'Post'], ['published'=>'1']); Fabricate::create('User', function($data, $world) { return [ 'user' => 'taro', 'Post' => $world->association(['PublishedPost', 'association'=>'Post'], 3), ]; }); // can use association alias (Post belongs to Author of User class) Fabricate::define(['PublishedPost', 'class'=>'Post'], ['published'=>'1']); Fabricate::create('PublishedPost', 3, function($data, $world) { return [ 'Author' => $world->association(['User', 'association'=>'Author'], ['id'=>1,'user'=>'taro']), ]; });
序列
序列允许您在每次生成函数中获取一系列唯一的数字。Fabrication提供了简单灵活的方式来跟踪序列。
配置
允许您指定所有序列的默认起始数字。这仍然可以覆盖特定序列。
Fabricate::config(function($config) { $config->sequence_start = 100; });
用法
Fabricate::config(function($config) { $config->sequence_start = 100; }); $results = Fabricate::attributes_for('Post', 10, function($data, $world){ return [ 'id'=> $world->sequence('id'), 'title'=> $world->sequence('title', 1, function($i){ return "Title {$i}"; }) ]; }); // $results is followings : array ( 0 => array ( 'id' => 100, // starting configure sequence 'title' => 'Title 1', // closure function returned ... ), 1 => array ( 'id' => 101, // starting configure sequence 'title' => 'Title 2', // closure function returned ...
如果您想在生成函数中使用序列,回调函数有第二个参数。$world
是FabricateContext实例。它具有序列方法。
FabricateContext#sequence API
您应该为序列设置名称参数。
$world->sequence('id')
如果您想指定起始数字,可以使用第二个参数。它将在第一次调用时始终返回种子数字,在后续调用中将忽略。
$world->sequence('id', 10)
如果您生成的是类似唯一字符串的东西,可以传递一个回调函数,并返回回调函数的响应。
$world->sequence('title', function($i){ return "Title {$i}"; } // or with start number $world->sequence('title', 1, function($i){ return "Title {$i}"; }
特性
特性允许您将属性分组,然后将它们应用到任何生成对象上。
Fabricate::define(['trait'=>'published'], ['published'=>'1']); Fabricate::create('Post', function($data, $world) { $world->traits('published'); return ['author_id'=>5]; });
traits
可以指定定义的名称作为数组
Fabricate::define(['trait'=>'published'], ['published'=>'1']); Fabricate::define(['trait'=>'author5'], function($data, $world) { return ['author_id'=>5]; }); Fabricate::create('Post', function($data, $world) { $world->traits(['published','author5']); return []; });
Faker
Faker是一个PHP库,为您生成假数据。Fabrication提供了根据规则生成自定义值的功能。
配置
Faker支持本地化。默认区域设置为en_EN。允许您指定区域。这仍然可以覆盖特定的Faker Factory。
Fabricate::config(function($config) { $config->faker = Faker\Factory::create('ja_JP'); });
用法
Fabricate::config(function($config) { $config->faker = Faker\Factory::create('ja_JP'); // this is optional }); $results = Fabricate::attributes_for('User', function($data, $world){ return [ 'user'=> $world->faker()->name ]; });
重新加载
如果您需要在加载后重置fabricate到其原始状态。
Fabricate::clear();
为此库做出贡献
请随时通过新问题、请求、单元测试和代码修复或新功能为此库做出贡献。如果您想贡献一些代码,从develop创建一个功能分支,并给我们发送您的pull请求。