sizuhiko/fabricate

PHP测试数据生成器

2.0.3 2017-06-26 00:56 UTC

This package is auto-updated.

Last update: 2024-09-06 16:47:52 UTC


README

Build Status Coverage Status Total Downloads Latest Stable Version

Fabricate

PHP测试数据生成器

它受到了Ruby世界中的Fabricationfactory-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请求。