2 votes

Couverture de code PHPUnit pour une classe qui étend une classe abstraite

J'ai une classe abstraite Exception dans un espace de nom personnalisé qui n'a pas de méthodes abstraites. Toutes les méthodes sont montrées comme étant couvertes par ses tests (simulés de manière standard). La raison de rendre cette méthode abstraite n'est pas importante.

Ensuite, j'ai environ 10 classes qui s'étendent Exception mais n'ajoutez ni ne surchargez aucune méthode, propriété, constante, etc. Il est évident que tous ces éléments devraient également être couverts, mais ils sont indiqués comme n'étant pas entièrement couverts. J'ai lu la documentation et fait des recherches sur Internet pendant un certain temps, mais je n'ai pas trouvé la réponse.

  • PHP_CodeCoverage 1.1.3
  • PHPUnit 3.6.12
  • PHP 5.4.4
  • Xdebug 2.2.1-5.4-vc9

Tout en annotant avec @codeCoverageIgnore est une solution, je veux découvrir pourquoi cela se produit de cette façon plutôt que d'obtenir une couverture à 100%.

UPD : sources.

------------- classe abstraite ----------

namespace Jade\Core\Base;

abstract class Exception extends \Exception {
    /**
     * Additional info for exception
     * @var array|null
     */
    protected $info;

    public function __construct($message, array $info = null, $code = 0, \Exception $previous = null) {
        parent::__construct($message, $code, $previous);
        $this->info = $info;
    }

    /**
     * Get the Exception additional info
     * @return mixed
     */
    public function getInfo() {
        return $this->info;
    }
}

------------- Tests pour la classe abstraite ----------

class ExceptionTest extends \PHPUnit_Framework_TestCase {
    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testGetInfo() {
        $info = array('info' => 'test');
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message', $info));

        $this->assertEquals($info, $stub->getInfo());
    }

    /**
     * @covers \Jade\Core\Base\Exception
     *
     * @group  public
     */
    public function testConstructWithDefaultInfo() {
        $stub = $this->getMockForAbstractClass('\Jade\Core\Base\Exception', array('message'));
        $this->assertEmpty($stub->getInfo());
    }
}

------------- classe qui étend la classe abstraite ----------

namespace Jade\Core\Exceptions;

class Dict extends \Jade\Core\Base\Exception {
}

Code coverage tool output

Mise à jour

Renommer \Jade\Core\Base\Exception pour éviter une éventuelle collision avec \Exception n'a pas aidé (j'ai essayé \Jade\Core\Base\Ixception ).

Faire de la classe Exception une classe ordinaire et non abstraite n'a pas aidé non plus.

1voto

David Harkness Points 16674

La déclaration de la classe est considérée comme un code exécutable par l'utilisateur. Xdebug et vous devez utiliser cette classe (' \Jade\Core\Exceptions\Dict ' ci-dessus) afin de le montrer comme couvert. Comme cette classe est conçue pour être instanciée, vous devez créer au moins un objet en l'utilisant.

Comme indiqué, vos tests n'instancient pas Dict et donc Dict n'est en fait pas couvert. Vous devez changer votre création d'objet fantaisie pour utiliser Dict au lieu de \Jade\Core\Base\Exception .

$stub = $this->getMockForAbstractClass('\Jade\Core\Exceptions\Dict', ...);

Note

PHPUnit et PHP_CodeCoverage interprètent simplement les données fournies par Xdebug qui a quelques cas de figure où du code non exécutable est traité comme exécutable, y compris les accolades fermées sur if y else la déclaration de la classe n'est pas comptée comme exécutée même si vous l'instanciez, et que des lignes inexistantes avant et après le contenu du fichier sont exécutées. Si vous pouvez créer un cas de test minimal pour démontrer un vrai problème, postez-le à Suivi des problèmes de Xdebug .

1voto

zaq178miami Points 2400

Le problème était entièrement dans la classe autoloading. Pour que cela fonctionne, j'ai dû inclure manuellement les fichiers avec les sources des classes dans le fichier bootstrap.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X