2012-07-09 8 views
6

Ho cercato di ottenere gli oggetti mock di PHPUnit funzionanti per qualche codice legacy su cui sto lavorando, ma ho problemi a farlo sub-in per l'oggetto che sto cercando e sono abbastanza sicuro che deve si perché lo sto usando male.È possibile che PHPUnit Mock Object sostituisca un Created in Class?

Attualmente abbiamo una classe che viene utilizzata esclusivamente per creare query, quando un'altra classe vuole creare una query crea un oggetto di questa classe e passa i dettagli di sql e database. Quello che voglio fare è avere PHPUnit sostituire questo oggetto con una versione di prova che posso testare.

Ciò che ho trovato è, se creo l'oggetto fittizio nello script di test, il metodo da testare lo ignora. Suppongo che questo sia dovuto al fatto che il metodo sta creando e quindi utilizzando l'oggetto localmente anziché essere passato come parametro (nel qual caso potrei semplicemente fare riferimento al metodo con l'oggetto mock passato come parametro). Di seguito è riportato un esempio di ciò che il codice potrebbe essere simile:

class SampleClass{ 
    function loadData(){ 
     $sql = "SELECT * FROM users"; 
     $query = new Query(); 
     $query->query($sql); 
     while($row = $query->get_row()){ 
      if($row['email'] = ''){ 
       $this->errors[] = "Email missing from user ".$row['user_id']; 
      } 
      $result[] = $query->get_row(); 
     } 
     $this->users = $result; 
     if(count($user->errors) >= 1){ 
      return $user->errors; 
     }else{ 
      return true; 
     } 
    } 
} 

class Query{ 
    function query($sql){ 
     $this->result = mysql_query($sql); 
    } 
    function get_row(){ 
     return mysql_fetch_assoc($this->result); 
    } 
} 

C'è un modo per creare un oggetto fittizio nel file di test PHPUnit che sostituirà l'oggetto $ query in SampleClass con un oggetto fittizio che posso usare per testare i parametri passati e controllare la risposta di? Non potrò sostituire la classe di query o cambiare il modo in cui viene referenziata, poiché è ampiamente utilizzata in tutta la nostra applicazione, ma vorrei almeno essere in grado di creare una qualche forma di framework di test per questo. Apprezzerei qualsiasi aiuto tu possa dare

Modificato per chiarire che non c'è solo la query che si verifica nel metodo loadData, che è la parte del metodo che sto provando a testare. Spero di inserire un doppio del metodo della classe query get_row che restituirà una matrice preimpostata di dati di esempio per il metodo con cui lavorare piuttosto che un vero database

risposta

2

Sì, è possibile.

Tuttavia, è sufficiente creare uno stub di SampleClass proprio. E puoi anche creare il nome di classe o l'istanza di Query. Quindi puoi effettivamente iniettarlo. Direi che è un modo migliore e molto più facile per te scrivere i test allora.

+0

Questo funzionerebbe ancora se si eseguissero operazioni con quei dati e parte del metodo loadData? Mi rendo conto che posso sostituire i metodi con gli stub, ma ho pensato che avrebbe scavalcato il contenuto e mi avrebbe impedito di testare quei metodi. O dovrei dividere il metodo in modo che la creazione dell'oggetto query sia separata dal resto del metodo e creare uno stub per questo, restituendo i risultati dei test per la query? – SolidSquid

+0

Aggiunto un ulteriore bit di codice per delineare una delle azioni eseguite da questi metodi oltre alla semplice creazione dell'oggetto query e la restituzione di un array del risultato della query – SolidSquid

+1

"Sì, ciò è possibile". Come lo fai senza iniezione? –

Problemi correlati