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 the directory where the class is located that you want to write a testcase for.
In the directory you need to place one or more files with the name:
class.test_[testname].inc
A test cases needs the following structure:
atkimport("[modulename].[class you want to test]");
/**
* Unittests for the example class
*
*/
class test_testcase_name extends atkTestCase
{
/**
* Default constructor.
*/
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. Use it to initialise
* your testclass.
*/
function setUp()
{
//Don't forget to call the setUp of the parent.
parent::setUp();
}
/**
* This function will be called after all other test_* functions.
* Useful to clean stuff up.
*/
function tearDown()
{
//Don't forget to call the teadDown of the parent.
parent::tearDown();
}
/**
* Simple 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)
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");
}