Testing Your Behaviors
Once you wrote a behavior following this documentation, you have to unit test it. This page explains how to do that.
Writing a Test class
The first step to test your behavior is to write a Test class using your favorite testing framework. This section will use PHPUnit but you can easily reproduce the same steps with another framework.
Assuming you wrote a MyAwesomeBehavior
behavior which probably does amazing stuffs:
MyAwesomeBehavior
|_ src/
| \_ MyAwesomeBehavior.php
|
|_ tests/
\_ MyAwesomeBehaviorTest.php
The MyAwesomeBehaviorTest
class looks like the following one:
<?php
class MyAwesomeBehaviorTest extends \PHPUnit_Framework_TestCase
{
public function setUp()
{
if (!class_exists('MyObject')) {
$schema = <<<EOF
<database name="bookstore" defaultIdMethod="native">
<table name="my_object">
...
<behavior name="my_awesome" />
</table>
</database>
EOF;
$builder = new PropelQuickBuilder();
$config = $builder->getConfig();
$config->setBuildProperty('behavior.my_awesome.class', __DIR__.'/../src/MyAwesomeBehavior');
$builder->setConfig($config);
$builder->setSchema($schema);
$con = $builder->build();
}
}
}
We rely on the PropelQuickBuilder to generated all classes in memory. It's a convenient way to test some parts of Propel without using fixtures files.
Write a XML schema as usual, and use your new behavior in it. Now, take care of the line below. It's how you will register
your new behavior in the PropelQuickBuilder
:
<?php
$config->setBuildProperty('behavior.my_awesome.class', __DIR__.'/../src/MyAwesomeBehavior');
The PropelQuickBuilder
comes with a SQLite database. That means you can execute database queries in your tests.
Did you notice the $con
variable? It can be useful to add some logic to the database connection in use:
<?php
// Register a 'ACOS' SQL function as SQLite doesn't provide it by default
$con->sqliteCreateFunction('ACOS', 'acos', 1);
You can now use your in memory classes in your test methods. It will just work.
Using Composer
Composer is designed to manage your PHP dependencies without any effort. It's a pretty nice way to share your behavior with other people, or just to require it in your project.
A basic configuration looks like:
{
"name": "willdurand/propel-myawesome-behavior",
"description": "A nice description.",
"keywords": [ "propel", "behavior" ],
"license": "MIT",
"authors": [
{
"name": "William DURAND",
"email": "[email protected]"
}
],
"require": {
"propel/propel1": "1.6.*"
},
"autoload": {
"classmap": ["src/"]
}
}
Note
The convention is to prefix your package name with propel-, and to suffix it with -behavior.
Configuring PHPUnit
If you run the command below, Composer will setup your behavior to run the test suite:
php composer.phar install --dev
Now, you have to configure your project for PHPUnit. It's really easy. Start by copying the following phpunit.xml.dist
file:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="tests/bootstrap.php"
>
<testsuites>
<testsuite name="MyAwesomeBehavior Test Suite">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./src/</directory>
</whitelist>
</filter>
</phpunit>
Now, create the tests/bootstrap.php
file:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
set_include_path(__DIR__ . '/../vendor/phing/phing/classes' . PATH_SEPARATOR . get_include_path());
require_once __DIR__ . '/../vendor/propel/propel1/generator/lib/util/PropelQuickBuilder.php';
That's all! Now, you just have to run the phpunit
command, and it will launch your test suite.
Add your behavior to Travis-ci
Travis-ci is a distributed build platform for the open source community.
If you want to add your behavior to Travis-ci, you can use the following .travis.yml
file:
language: php
php:
- 5.3.2
- 5.3
- 5.4
before_script:
- curl -s http://getcomposer.org/installer | php
- php composer.phar --dev install
script: phpunit --coverage-text
Found a typo ? Something is wrong in this documentation ? Just fork and edit it !