Код выполняется до инициализации PHPUnit - PullRequest
2 голосов
/ 11 октября 2011

Я читал отчет о покрытии кода моего проекта и заметил кое-что странное: строка была обнаружена, но я был уверен, что эта строка была выполнена во время тестов.Итак, я добавил var_dump () перед ним, и вот что я получил при выполнении тестов:

bool(true)
PHPUnit 3.5.5 by Sebastian Bergmann.

...

Это странно.Как это возможно, что строка выполняется до инициализации PHPUnit?Я полагаю, что именно по этой причине покрытие кода говорит о том, что строка не обнаружена.

Есть какие-нибудь подсказки?

РЕДАКТИРОВАТЬ: Вот код.Это среда IRC, которая использует общую библиотеку Doctrine для чтения аннотаций, а также использует компоненты ClassLoader и EventDispatcher Symfony.Это инкриминируемый метод:

/**
 * Returns this module's reflection.
 * 
 * @return \ReflectionClass
 * @access public
 */
static public function getReflection()
{
    // The var_dump() displaying bool(false) is executed before PHPUnit, while the other
    // ones are correctly executed.
    var_dump(is_null(self::$reflection));

    if (null === self::$reflection) {
        // This line is reported as uncovered, but it must be executed since I'm
        // accessing the reflection!
        self::$reflection = new \ReflectionClass(get_called_class());
    }

    return self::$reflection;
}

Что вы думаете?

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Тогда почему все остальные var_dump () (этот метод многократно выполняется в приложении) отображаются после вывода PHPUnit?И почему эта строка не отображается в покрытии кода, даже если она выполнена?

Я предполагаю (но это только предположение, поскольку трудно сказать, поскольку вы не показали код), что это связано с кодом, который выполняется при включении файла, а не после того, как фактические функции теставыполнено или проверено на выполнение.

0 голосов
/ 11 октября 2011

Метод доступа должен вызываться вне модульного теста, который инициализирует self::$reflection. После этого все последующие вызовы getReflection() пропускают блок if, поэтому он никогда не будет считаться закрытым. PHPUnit создает все классы тестовых примеров - по одному на метод теста, метод поставщика данных и массив аргументов поставщика данных - перед выполнением любого из тестов или отслеживанием покрытия кода. Ищите тестовый пример, который вызывает getReflection() из своего конструктора или вне самого класса, где код выполняется при загрузке.

Я забыл, были ли созданы тестовые примеры до того, как PHPUnit выведет свою версию, и теперь не могу проверить, но я считаю, что это так. Другая возможность состоит в том, что вы звоните getReflection() из bootstrap.php, но вы, вероятно, уже проверили это.

...