Это ужасный хак, но он работает в PHPUnit 3.6.У нас уже есть свой собственный базовый класс тестового набора, который расширяют все остальные.Если не имеет значения, когда файлы добавляются в белый список, вы можете сделать это, используя поддельный тестовый пример только для обработки этой части.
Во-первых, bootstrap.php
вызывает BaseTestCase :: addXXXToCodeCoverageWhitelist () столько разпо мере необходимости заполнять внутренний массив файлов, чтобы добавить позже.Затем первый выполняемый тест добавляет эти файлы в фильтр покрытия кода через TestResult
.
abstract class BaseTestCase extends PHPUnit_Framework_TestCase
{
private static $_codeCoverageFiles = array();
public static function addDirectoryToCodeCoverageWhitelist($path) {
self::addFilesToCodeCoverageWhitelist(self::getFilesForDirectory($path));
}
public static function addFileToCodeCoverageWhitelist($path) {
self::addFilesToCodeCoverageWhitelist(array($path));
}
public static function addFilesToCodeCoverageWhitelist(array $paths) {
self::$_codeCoverageFiles = array_merge(self::$_codeCoverageFiles, $paths);
}
public static function getFilesForDirectory($path) {
$facade = new File_Iterator_Facade;
return $facade->getFilesAsArray($path, '.php');
}
private static function setCodeCoverageWhitelist(PHP_CodeCoverage $coverage = null) {
if ($coverage && self::$_codeCoverageFiles) {
$coverage->setProcessUncoveredFilesFromWhitelist(true); // pick your poison
$coverage->filter()->addFilesToWhitelist(self::$_codeCoverageFiles);
self::$_codeCoverageFiles = array();
}
}
public function runBare() {
self::setCodeCoverageWhitelist($this->getTestResultObject()->getCodeCoverage());
parent::runBare();
}
}
Обновление: Для всех, кто использовал черный список, чтобы сохранить классы инфраструктуры отобнаруживая в трассировке стека ошибок утверждений, как мы это сделали, добавьте следующие методы в вышеприведенный класс и вызовите их из вашего bootstrap.php
.Для этого требуется setAccessible()
из PHP 5.3.
public static function ignoreDirectoryInStackTraces($path) {
ignoreFilesInStackTraces(self::getFilesForDirectory($path));
}
public static function ignoreFileInStackTraces($path) {
ignoreFilesInStackTraces(array($path));
}
public static function ignoreFilesInStackTraces($files) {
static $reflector = null;
if (!$reflector) {
PHPUnit_Util_GlobalState::phpunitFiles();
$reflector = new ReflectionProperty('PHPUnit_Util_GlobalState', 'phpunitFiles');
$reflector->setAccessible(true);
}
$map = $reflector->getValue();
foreach ($files as $file) {
$map[$file] = $file;
}
$reflector->setValue($map);
}