__autoload не соблюдается при тестировании с PHPUnit - PullRequest
11 голосов
/ 07 июля 2011

Как я могу заставить 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".

Ответы [ 3 ]

23 голосов
/ 07 июля 2011

Это ожидаемое поведение.

См. Эту запись средства отслеживания ошибок PHPUnit: Upgrading to 3.5.10 has broken function of "autoload"

Начиная с версии PHPUnit 3.5:

PHPUnit теперь использует автозагрузчик для загрузки своих классов. Если для тестируемого кода требуется автозагрузчик, используйте spl_autoload_register () для его регистрации.

Быстрое исправление:

Единственное необходимое изменение - добавить spl_autoload_register('__autoload') в скрипт начальной загрузки.

Дольше исправить:

Если вы можете, я бы посоветовал вам просто избавиться от __autoload все вместе и использовать spl_autoload_register в вашем приложении, так как это путь для работы с кодом PHP 5. (Если у вас есть только один автозагрузчик, вы не можете использовать автозагрузчик вашей платформы и т. Д.)

3 голосов
/ 07 июля 2011

Попробуйте использовать spl_autoload_register вместо __autoload.spl_autoload_register позволяет многопользовательским автозагрузчикам работать вместе, не мешая друг другу.

2 голосов
/ 26 ноября 2013

PHPUnit использует spl_autoload_register, который отключает __autoload.

...