PHP Data Factory

I’ve recently written a super simple Data Factory for PHP, called FactoryLib. This can be used to create test data when unit testing your PHP code.

Including this in your tests is very simple

1
2
require 'factory_lib.php' ;
Factory::$factory_data['my_table_name'] = array('name' => 'Jeb Wilkins', 'age' => '101') ;

There are two static methods which can be used to create data

  • Create – predictably used to create rows – Factory::create(‘my_other_table’)
  • Hash – returns an associative array of the data that would otherwise have been inserted – Factory::hash(‘my_table_name’)

Column values can be overridden from the defaults by supplying and array of overriding values as the second parameter, eg

1
Factory::create('my_table_name', array('name' => 'Alter Ego')) ;

Dynamic Definitions

You can also generate differing string data dynamically using the {{counter}} magic string so

1
2
3
4
Factory::$factory_data['some_table'] = array('name' => 'Test User {{counter}}', 'age' => 17)) ;
 
for($i = 10; $i < 0; $i++)
  Factory::create('some_table') ;

would create 10 users name ‘Test User 1′ through to ‘Test User 10′. To reset the counter use either Factory::reset_counter() to reset the counter for all tables, or Factory::reset_counter(‘my_table_name’) to just reset the counter for a specific table name.

To use this in your code you can do something like the following

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require_once 'PHPUnit/Framework.php' ;
require_once 'factory_lib.php' ;
 
$GLOBALS['show_db_errors'] = true ; // causes factory lib to output errors if something goes wrong
 
mysql_connect() ; //may need some connection parameters depending upon your setup
mysql_select_db('my_test_db') ; // You do _not_ want this to be your development (or production) database
 
Factory::$factory_data['person'] = array('name' => 'Test User {{counter}}', 'address1' => 'First Line of Address') ;
 
class personTest extends PHPUnit_Framework_TestCase {
 
  function setUp() {
    Factory::truncate('person') ; // function not implemented yet but will be shortly
  }
 
  function testCountingUsers() {
    for($i = 0; $i < 5; $i++)
       Factory::create('person') ;
 
    $this->assertEquals(5, MyPersonClass::countAllPeople()) ;
  }
}

Get the code from GitHub

This entry was posted in php. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>