PHPUnit and autoloaders: Determining whether code is running in test-scope?
- by pinkgothic
Premise
I know that writing code to act differently when a test is run is hilariously bad practise, but I may've actually come across a scenario in which it may be necessary.
Specifically, I'm trying to test a very specific wrapper for HTML Purifier in the Zend framework - a View Helper, to be exact. The HTML Purifier autoloader is necessary because it uses a different logic to the autoloaders we otherwise have.
Problem
require()-ing the autoloader at the top of my View Helper class, gives me the following in test-scope:
HTML Purifier autoloader registrar is not compatible
with non-static object methods due to PHP Bug #44144;
Please do not use HTMLPurifier.autoload.php (or any
file that includes this file); instead, place the code:
spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload'))
after your own autoloaders.
Replacing the require() with spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) as advertised means the test runs fine, but the View Helper dies a terrible death claiming:
Zend_Log[3707]: ErrorController caught LogicException "Passed array does not specify an existing static method (class 'HTMLPurifier_Bootstrap' not found)"
(Our test folder structure is slightly different to our Zend folder structure by necessity.)
Question(s)
After tinkering with it, I'm thinking I'll need to pick an autoloader-loading depending on whether things are in the test scope or not.
Do I have another option to include HTMLPurifier's autoloading routine in both cases that I'm not seeing due to tunnel vision?
If not, do I have to find a means to differentiate between test-environment and production-environment this with my own code (e.g. APPLICATION_ENV) - or does PHPUnit support this godawful hackery of mine natively by setting a constant that I could check whether its been defined(), or similar shenanigans? (My Google-fu here is weak! I'm probably just doing it wrong.)