__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.