__autoload not respected when testing with PHPUnit
How can I make PHPUnit respect __autoload functions?
For example, I have these three files:
loader.php
function __autoload($name)
{
echo "foo\n";
require_once("$name.php");
}
test.php
require_once("loader.php");
class FooTest extends PHPUnit_Fram开发者_StackOverflow社区ework_TestCase
{
function testFoo()
{
new Foo();
}
}
foo.php
require_once("loader.php");
new Foo();
As expected php foo.php
errors out, saying that file "Foo.php" doesn't
exist. The testFoo()
function however errors out by saying that there is
no such class as Foo
, and never echos the "foo\n" line.
This is expected behavior.
See this PHPUnit bugtracker entry: Upgrading to 3.5.10 has broken function of "autoload"
As of PHPUnit 3.5:
PHPUnit now uses an autoloader to load its classes. If the tested code requires an autoloader, use spl_autoload_register() to register it.
Quick fix:
The only change required is to add spl_autoload_register('__autoload')
in your bootstrap script.
Longer fix:
If you can I'd suggest you just get rid of __autoload
all together and use spl_autoload_register
in your application as it is the way to go with PHP 5 code. (If you only have one autoloader you can't use the autoloader of your framework and so on)
Try using spl_autoload_register
instead of __autoload
. spl_autoload_register
allows for multipe autoloaders to work together without clobbering each other.
PHPUnit uses spl_autoload_register which turns off __autoload.
精彩评论