PHPUnit and namespaces
2011-03-01Just some quick notes about unexpected interactions I found when unit testing namespaced PHP code with PHPUnit.
Escape your namespace separators
In general, you need to double all of your namespace separators (i.e. escape the backslash with another backslash), like so:
phpunit --skeleton-test KuCal\\Api Api.php
This is the correct usage. However, the following the form (currently) in the docs:
phpunit --skeleton-test KuCal\Api Api.php
I've submitted the above as a documentation issue so it may be fixed by the time anybody reads this. Moving on.
Remove leading separators for getMock
You may also have to remove leading slashes from namespaced classes in getMock.
This is how the class is called in my PHP, just wrapped in single quotes. It fails.
$this->getMock('\Buzz\Browser');
This is the call with the namespace separators escaped, as above. It also fails:
$this->getMock('\\Buzz\\Browser');
This is the code with escaped separators and the first root separator removed. This version succeeds:
$this->getMock('Buzz\\Browser');
@expectedException
As a final note, the 2nd point above doesn't seem to apply to the @expectedException
annotation. I haven't tried it with other annotations, but this is still perfectly valid and effective:
/**
* @expectedException \InvalidArgumentException
*/
Sources<
Several questions on StackOverflow, and the PHPUnit docs.