Во-первых: 100% охват кода - отличный показатель для стремления для. Это просто не всегда достижимо при разумных усилиях, и это не всегда важно:)
Проблема возникает из-за того, что xDebug сообщает PHPUnit, что эта строка является исполняемой, но не покрыта.
В простых случаях xDebug может сказать, что линия НЕ доступна, поэтому вы получаете 100% покрытие кода.
См. Простой пример ниже.
2-е обновление
Теперь проблема исправлена xDebug bugtracker
, поэтому создание новой версии xDebug решит эти проблемы:)
Обновление (проблемы с php 5.3.x см. Ниже)
Поскольку вы работаете с PHP 5.4 и версией xDebug для DEV, я установил их и протестировал. Я сталкиваюсь с теми же проблемами, что и вы, с тем же выводом, который вы прокомментировали.
Я не на 100% уверен, что проблема связана с php-code-coverage
(модуль phpunit) для xDebug. Это может также быть проблема с xDebug dev.
Я подал ошибку с php-code-coverage
, и мы выясним, откуда возникла проблема.
Для вопросов PHP 5.3.x:
Для более сложных случаев это CAN fail.
Для кода, который вы показали, все, что я могу сказать, это «Это работает для меня» ( сложный пример ниже ).
Возможно, обновите версии xDebug и PHPUnit и попробуйте снова.
Я видел сбой в текущих версиях, но это зависит от того, как иногда выглядит весь класс.
Удаление ?:
операторов и других многострочных операторов может также помочь.
Насколько я знаю, в xDebug продолжается рефакторинг, чтобы избежать большего количества таких случаев. Однажды xDebug хочет иметь возможность «обеспечивать покрытие выписок», и это должно исправить многие из этих случаев. Пока здесь мало что можно сделать
Хотя //@codeCoverageIgnoreStart
и //@codeCoverageIgnoreEnd
"покроют" эту строку, это выглядит действительно ужасно и обычно приносит больше вреда, чем пользы.
Для другого случая, когда это происходит, см. Вопрос и ответы от:
what-to-do-when-project-coding-standards-conflicts-with-unit-test-code-coverage
Простой пример:
<?php
class FooTest extends PHPUnit_Framework_TestCase {
public function testBar() {
$x = new Foo();
$this->assertSame(1, $x->bar());
}
}
<?php
class Foo {
public function bar() {
return 1;
}
}
производит:
phpunit --coverage-text mep.php
PHPUnit 3.6.7 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.50Mb
OK (1 test, 1 assertion)
Generating textual code coverage report, this may take a moment.
Code Coverage Report
2012-01-10 15:54:56
Summary:
Classes: 100.00% (2/2)
Methods: 100.00% (1/1)
Lines: 100.00% (1/1)
Foo
Methods: 100.00% ( 1/ 1) Lines: 100.00% ( 1/ 1)
Сложный пример:
<?php
require __DIR__ . '/foo.php';
class FooTest extends PHPUnit_Framework_TestCase {
public function testBar() {
$this->assertSame('b', Foo::getDomain('a'));
$this->assertInstanceOf('Config', Foo::getDomain('foo'));
}
}
<?php
class Foo {
static $domains = array('a' => 'b');
static public function &getDomain($domain = null) {
$domain = $domain ?: self::domain();
if (! array_key_exists($domain, self::$domains)) {
self::$domains[$domain] = new Config();
}
return self::$domains[$domain];
}
}
class Config {}
производит:
PHPUnit 3.6.7 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.50Mb
OK (1 test, 2 assertions)
Generating textual code coverage report, this may take a moment.
Code Coverage Report
2012-01-10 15:55:55
Summary:
Classes: 100.00% (2/2)
Methods: 100.00% (1/1)
Lines: 100.00% (5/5)
Foo
Methods: 100.00% ( 1/ 1) Lines: 100.00% ( 5/ 5)