Написание PHP-пакета здесь, TDD с PhpUnit 4+.
Написание тестов для всех моих обычных классов отлично работает, и они описаны в отчете. Но когда я тестирую макет абстрактного класса, даже если тест явно проходит через метод (он терпит неудачу, если я не могу его реализовать или если я помещаю туда некоторые контрольные точки), охват кода составляет 0%.
Я извлек оскорбительный код в репо Вот, если ты хочешь дать ему водоворот. Все, что вам нужно сделать, это клонировать, установить композитор и запустить phpunit, все настроено.
Это выполняется на Vagrant box, поэтому изолированная среда, которая не имеет ничего общего с моей версией PHP или доступными расширениями, была протестирована другие люди, тоже на своих установках, дающих те же результаты.
Тестируемый абстрактный класс Вот, в то время как его тест можно увидеть Вот.
Любые намеки на то, что я, возможно, делаю здесь неправильно, будут с благодарностью.
Редактировать:
Итак, в качестве дополнительного объяснения, смотрите комментарии к принятому ответу ниже и твиты Джорди Вот. По сути, по соображениям производительности автозагрузчик Composer просто следует регистру файловой системы, в которой он включен, поэтому лучше использовать тот же регистр в папках, что и в именах классов. Если ваше пространство имен в верхнем регистре, ваша папка тоже должна быть. Это все еще оставляет открытым вопрос о том, почему это на самом деле удалось читай и беги метод класса, но не помечал его как покрытый, поэтому, если у вас есть какое-либо понимание этого, пожалуйста, оставьте комментарий или более полный ответ, и я его приму снова.
Изменить 2:
Дополнительное разумное объяснение от dstockto от IRC:
Я считаю, что проблема заключается в том, что когда phpunit собирает информацию о покрытии кода, он находится в массивах PHP. Ключи чувствительны к регистру, и поэтому, несмотря на то, что вы охватили это, охват был для файла с другим регистром, который PHPunit не соответствует файлам, которые были загружены
У меня это работает, и охват составляет 100%. 🙂 Проблема была в следующем:
$ phpunit --verbose --bootstrap vendor/autoload.php
PHPUnit 4.4.2 by Sebastian Bergmann.
Configuration read from /home/ren/tmp/phpunit-oddity/phpunit.xml.dist
E
Time: 151 ms, Memory: 3.25Mb
There was 1 error:
1) Swader\Diffbot\Test\ApiTest::testSetTimeout
PHPUnit_Framework_MockObject_RuntimeException: Class "Swader\Diffbot\Abstracts\Api" does not exist.
Отладка показала, что настоящая проблема заключается в нечувствительной к регистру файловой системе на вашем хосте. Vagrant работает под управлением Linux. каталог abstracts
это не то же самое, что Abstracts
, PhpUnit в Linux не может найти класс, который ищет.
Других решений пока нет …