2014-12-16 10 views
5

Sto cercando di testare i metodi dalla seguente classe che ho scritto (ci sono più funzioni di quanto ciò che viene mostrato, in sostanza, una funzione per ciascuno è _ *() metodo):Come PHPUnit testare un metodo senza valore di ritorno?

class Validate { 
    private static $initialized = false; 

    /** 
    * Construct won't be called inside this class and is uncallable from the outside. This prevents 
    * instantiating this class. This is by purpose, because we want a static class. 
    */ 
    private function __construct() {} 

    /** 
    * If needed, allows the class to initialize itself 
    */ 
    private static function initialize() 
    { 
    if(self::$initialized) { 
     return; 
    } else { 
     self::$initialized = true; 
     //Set any other class static variables here 
    } 
    } 

    ... 

    public static function isString($string) { 
    self::initialize(); 
    if(!is_string($string)) throw new InvalidArgumentException('Expected a string but found ' . gettype($string)); 
    } 

    ... 

} 

Quando ho verificare se il i metodi generano un'eccezione sull'input non valido, funziona alla grande! Tuttavia, quando provo se il metodo funziona come previsto, PHPUnit si lamenta perché non ho asserito nel test. L'errore specifico è:

# RISKY This test did not perform any assertions 

Tuttavia, non ho alcun valore far valere nei confronti quindi non sono sicuro di come superare questo.

Ho letto un po 'di test sui metodi statici, ma che sembra soprattutto coprire le dipendenze tra i metodi statici. Inoltre, anche i metodi non statici potrebbero non avere alcun valore di ritorno, quindi, come risolvere questo problema?

Per riferimento, il mio codice di prova:

class ValidateTest extends PHPUnit_Framework_TestCase { 
    /** 
    * @covers ../data/objects/Validate::isString 
    * @expectedException InvalidArgumentException 
    */ 
    public function testIsStringThrowsExceptionArgumentInvalid() { 
    Validate::isString(NULL); 
    } 

    /** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    Validate::isString("I am a string."); 
    } 
} 
+2

Perché questo metodo non restituisce true/false? Perché sarebbe un'eccezione quando un parametro non stringa viene passato come parametro, poiché ovviamente un metodo per verificare se qualcosa è una stringa, dovrebbe aspettarsi valori non stringa o non c'è utilità per il metodo. Questo sembra un metodo mal concepito. –

+0

@MikeBrant Non ritorna perché non ne ha bisogno. Uso il metodo nel mio codice come interruzione/affermazione: se il metodo non genera un'eccezione, il mio codice continua normalmente. Se lo fa, l'eccezione deve essere affrontata. Non vi è alcuna ragione per restituire nulla da questi metodi e ancora meno ragioni per scrivere se/else istruzioni e cicli di spesa che controllano quei valori di ritorno. Voglio eccezione invece di VERO/FALSO perché le eccezioni possono bloccare l'esecuzione del codice. Se metti un int dove un array dovrebbe andare in Java (o nella maggior parte delle lingue tipizzate) ottieni un'eccezione. Voglio funzionalità simili. –

+0

@MikeBrant Inoltre, un test corretto significa che il mio metodo funziona sia per input validi che non validi. –

risposta

3

Una soluzione che ho scenderà su è la seguente, sulla base di example 2.12 from chapter 2 of PHPUnit. Mi sembra un po 'hacky, ma è il migliore che ho trovato finora. Inoltre, in base a questo PHPUnit Gitub issue discussion, sembra che molte altre persone vogliano questa funzione, ma che non ci sono piani per implementarla.

Change testIsStringNoExceptionArgumentValid() per la seguente: funzione void

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
    try { 
     Validate::isString("I am a string."); 
    } catch (InvalidArgumentException $notExpected) { 
     $this->fail(); 
    } 

    $this->assertTrue(TRUE); 
    } 
+1

Non hai bisogno del try/catch bit. Non c'è bisogno di fallire(), l'eccezione lo farà. –

+0

Come testare un metodo che non restituisce nulla e non lancia alcuna eccezione – Somar

2

di prova con assertNull:

/** 
    * @covers ../data/objects/Validate::isString 
    */ 
    public function testIsStringNoExceptionArgumentValid() { 
     $this->assertNull(Validate::isString("I am a string.")); 
    } 
Problemi correlati