2009-08-12 16 views
9

Ho cercato ma non riesco a trovare quello che sto cercando e il manuale non è di grande aiuto in questo senso. Sono abbastanza nuovo ai test unitari, quindi non sono sicuro di essere sulla buona strada. Comunque, sulla domanda. Ho una classe:Creazione di oggetti fittizi nell'unità PHP

<?php 
    class testClass { 
     public function doSomething($array_of_stuff) { 
      return AnotherClass::returnRandomElement($array_of_stuff); 
     } 
    } 
?> 

Ora, chiaramente voglio il AnotherClass::returnRandomElement($array_of_stuff); di restituire la stessa cosa ogni volta. La mia domanda è, nel mio test unitario, come posso simulare questo oggetto?

Ho provato ad aggiungere AnotherClass all'inizio del file di test, ma quando voglio testare AnotherClass viene visualizzato l'errore "Can not redeclare class".

Penso di capire le classi di fabbrica, ma non sono sicuro di come applicherò questo in questo caso. Avrei bisogno di scrivere una classe AnotherClass completamente separata che contenesse i dati di test e quindi utilizzare la classe Factory per caricare quello invece del vero AnotherClass? O sta usando il modello di fabbrica solo una falsa pista.

ho provato questo:

$RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils'); 

    $o1 = new stdClass(); 
    $o1->id = 2; 
    $o1->test_id = 2; 
    $o1->weight = 60; 
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1"; 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('chooseRandomRoot') 
     ->will($this->returnValue($o1)); 
    $RedirectUtils_stub->expects($this->any()) 
     ->method('decodeQueryString') 
     ->will($this->returnValue(array())); 

nella funzione setup(), ma questi stub vengono ignorati e non riesco a capire se si tratta di qualcosa che sto facendo male, o il modo in cui sto accedendo i metodi AnotherClass.

Help! Questo mi sta facendo impazzire.

risposta

6

Con Test unità si desidera creare classi 'test' che contengono dati statici e quindi passarle nella classe testata. Questo rimuove le variabili dal test.

class Factory{ 
    function build() 
    { 
     $reader = new reader(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 

class Factory{ 
    function build() 
    { 
     $reader = new reader_mock(); 
     $test = new test($reader); 
     // ..... do stuff 
    } 

} 
class reader_mock 
{ 
    function doStuff() 
    { 
     return true; 
    } 
} 

Poiché si utilizza classi statiche, si dovrà rimuovere AnotherClass dal programma, e quindi ricrearlo in modo che contenga solo le funzioni che restituiscono dati di test. Normalmente, però, non si desidera rimuovere effettivamente le classi dal programma, motivo per cui si passano le classi come nell'esempio precedente.

+0

Brillante, grazie per la risposta. Una domanda però; quindi, ho una mia classe Factory, che crea tutte le istanze per me. Questa è la classe che va in produzione. Aggiungo il materiale degli oggetti simulati in questa classe, o semplicemente lascio la classe di produzione principale come produzione, quindi aggiungo una nuova classe di fabbrica per le unittests? – Mike

+0

Questo è tutto per te. È possibile creare una nuova classe factory per i test, oppure assicurarsi di aver ripulito la classe Factory dopo averla testata. –

Problemi correlati