Writing tests
Appearance
(This howto is a work in progress) To create a test you need to take the following steps:
Create a directory 'testcases' in your module directory.
In the directory you need to place one or more files with the name:
class.test_[testnaam].inc
A test cases needs the following structure:
require_once(moduleDir("[modulename]")."class.[class you want to test].inc");
//Take for example the class 'class.example.inc'
/**
* Unittests for the example class
*
*/
class test_testcase_name extends atkTestCase
{
//Warning: This is PHP5.
public function __construct()
{
parent::__construct(); //Not necessary now, but maybe in the future.
$this->addFixture('module.table'); //Fixtures need to be loaded in the constructor.
}
//This function will be called before all other test_* functions.
function setUp()
{
//Don't forget to call the setUp of the parent.
parent::setUp();
}
//This function will be called after all other test_* functions.
function tearDown()
{
//Don't forget to call the teadDown of the parent.
parent::tearDown();
}
//Simpele test function
function test_doSomething()
{
//Do some stuff
$class = new exampleclass();
$class->doSomething();
$result = $class->getSomeValue;
$this->assertEqual($result,'expected_value','text in the test.');
}
}
The actual testing is done by the assert* functions. Here is a small list of the most used ones:
assertNull($value, $message = "%s") assertIsA($object, $type, $message = "%s") assertEqual($first, $second, $message = "%s") assertIdentical($first, $second, $message = "%s") assertReference(&$first, &$second, $message = "%s") assertCopy(&$first, &$second, $message = "%s") assertWantedPattern($pattern, $subject, $message = "%s") assertNoUnwantedPattern($pattern, $subject, $message = "%s") assertNoErrors($message = "%s") assertError($expected = false, $message = "%s") assertErrorPattern($pattern, $message = "%s") assertTrue($result, $message = false) assertFalse($result, $message = false)
These can be found in the 'atk/test' directory.
More information:
Overloaders
Sometimes a function uses a class for which you need to do some extra setup, at that point it can be handy to use a 'mock' class which will return some default results. Then you can overload this class by using an overloader:
This only works when a class is loaded with atkNew().
An example:
function test_aclass()
{
// I know this function uses atkSoap, but we don't want to use it for this test
atkClassLoader::addOverloader("atk.utils.atksoap", "mycustomsoapstub");
$result = afunction();
$this->assertEqual($result, "blabla", "result should be blabla");
}