2015-06-26 35 views
21

Voglio sapere se esiste una soluzione su come testare un tratto di PHP.Come testare i tratti PHP

So che possiamo testare una classe che utilizza il tratto. ma mi stavo chiedendo se ci sono approcci migliori.

Grazie per qualsiasi consiglio in anticipo :)

EDIT

Un'alternativa è quella di utilizzare il Trait nella classe di test in sé, come ho intenzione di dimostrare a soffietto.

Ma non `m che appassionato di questo approccio poiché non v'è alcuna garanzia che non ci sono i nomi dei metodi simili tra il tratto, la classe e anche il PHPUnit_Framework_TestCase (in questo esempio):

Ecco un esempio tratto:

trait IndexableTrait 
{ 
    /** @var int */ 
    private $index; 

    /** 
    * @param $index 
    * @return $this 
    * @throw \InvalidArgumentException 
    */ 
    public function setIndex($index) 
    { 
     if (false === filter_var($index, FILTER_VALIDATE_INT)) { 
      throw new \InvalidArgumentException('$index must be integer.'); 
     } 

     $this->index = $index; 

     return $this; 
    } 

    /** 
    * @return int|null 
    */ 
    public function getIndex() 
    { 
     return $this->index; 
    } 
} 

e la sua prova:

class TheAboveTraitTest extends \PHPUnit_Framework_TestCase 
{ 
    use TheAboveTrait; 

    public function test_indexSetterAndGetter() 
    { 
     $this->setIndex(123); 
     $this->assertEquals(123, $this->getIndex()); 
    } 

    public function test_indexIntValidation() 
    { 
     $this->setExpectedException(\Exception::class, '$index must be integer.'); 
     $this->setIndex('bad index'); 
    } 
} 
+0

Si prega di fornire il codice che avete tentato di fare questo con la quale non funziona. Questo aiuterà qualcuno a aiutarti. –

+0

@AdamB, ho scritto io stesso [la prima risposta] (http://stackoverflow.com/a/31083193/4960774), che ha un codice di esempio. ma per favore notate che non è come se qualcosa fosse rotto o non funzionasse, voglio solo sapere se ci sono dei buoni metodi per testare i tratti del test direttamente e non indirettamente tramite un'unità testando una classe che usa quel tratto. carri armati – Ali

risposta

35

È possibile verificare un tratto con una simila r per testare i metodi concreti di una classe astratta.

PHPUnit has a method getMockForTrait che restituirà un oggetto che utilizza il tratto. Quindi puoi testare le funzioni dei tratti.

Ecco l'esempio dalla documentazione:

<?php 
trait AbstractTrait 
{ 
    public function concreteMethod() 
    { 
     return $this->abstractMethod(); 
    } 

    public abstract function abstractMethod(); 
} 

class TraitClassTest extends PHPUnit_Framework_TestCase 
{ 
    public function testConcreteMethod() 
    { 
     $mock = $this->getMockForTrait('AbstractTrait'); 

     $mock->expects($this->any()) 
      ->method('abstractMethod') 
      ->will($this->returnValue(TRUE)); 

     $this->assertTrue($mock->concreteMethod()); 
    } 
} 
?>