__autoload не соблюдается при тестировании с помощью PHPUnit
Как я могу заставить PHPUnit уважать функции __autoload?
Например, у меня есть три файла:
loader.php
function __autoload($name)
{
echo "foo\n";
require_once("$name.php");
}
test.php
require_once("loader.php");
class FooTest extends PHPUnit_Framework_TestCase
{
function testFoo()
{
new Foo();
}
}
foo.php
require_once("loader.php");
new Foo();
Как ожидалось php foo.php
ошибки, заявив, что файл "Foo.php" не
существовать. Функция testFoo()
, однако, ошибается, говоря, что есть
нет такого класса, как Foo
, и никогда не выделяет строку "foo\n".
Ответы
Ответ 1
Это ожидаемое поведение.
См. эту запись PHPUnit bugtracker: Upgrading to 3.5.10 has broken function of "autoload"
Начиная с PHPUnit 3.5:
PHPUnit теперь использует автозагрузчик для загрузки своих классов. Если для протестированного кода требуется автозагрузчик, используйте функцию spl_autoload_register(), чтобы зарегистрировать его.
Быстрое исправление:
Единственное изменение, которое необходимо изменить, - добавить spl_autoload_register('__autoload')
в ваш загрузочный файл script.
Более длинное исправление:
Если вы можете предложить вам просто избавиться от __autoload
все вместе и использовать spl_autoload_register
в своем приложении, так как это способ пойти с кодом PHP 5. (Если у вас есть только один автозагрузчик, вы не можете использовать автозагрузчик вашего фреймворка и т.д.)
Ответ 2
Попробуйте использовать spl_autoload_register
вместо __autoload
. spl_autoload_register
позволяет многопользовательским автозагрузчикам работать вместе, не сбиваясь друг с другом.
Ответ 3
PHPUnit использует spl_autoload_register, который отключает __autoload.