2015-07-26 17 views
9

Ho questa funzione Voglio testare simile a questo:test error_log con PHPUnit

class Logger { 
    function error($msg){ 
    if (is_string($msg)){ 
     error_log($msg); 
     die($msg); 
    } elseif (is_object($msg)){ 
     error_log($msg.' '.$msg->getTraceAsString()); 
     die('exception'); 
    } else { 
     var_dump($msg); 
     die('error'); 
    } 
    } 

Voglio provare questa funzione senza registrare il $msg. C'è un modo per determinare se error_log funziona senza la registrazione? Ho provato a utilizzare setExpectedException ma non sono riuscito a rilevare l'errore e ha mantenuto la registrazione.

+0

Il mio interesse era principalmente su come testare il codice che chiama 'error_log', l'esempio di Alister di override error_log nello spazio dei nomi corrente ha funzionato per il test. – ThorSummoner

risposta

8

La risposta ovvia è un semplice/proxy-funzione alias che si chiama error_log nella classe Logger (che può essere facilmente deriso, e controllato per vedere quale è impostato ad esso),

Per testare effettivamente il nativo tuttavia, la funzione error_log (senza un proxy nella classe originale) può essere eseguita con namespace. Il test verrebbe definito come lo stesso spazio dei nomi del codice originale, quindi, dopo la classe di test, aggiungere una funzione, in questo caso error_log(), ma tale funzione viene anche definita nello spazio dei nomi e quindi verrà eseguita preferibilmente a l'equivalente del namespace-root dalle funzioni native.

Purtroppo, non si può fare lo stesso con assoluta die (o il suo alias, exit). Sono "costrutti linguistici" e non possono essere sovrascritti come error_log can.

<?php 
namespace abc; 
use abc\Logger; 

class ThreeTest extends \PHPUnit_Framework_TestCase 
{ 
    public function setUp() { $this->l = new Logger(); } 
    // test code to exercise 'abc\Logger' 

} 

// Now define a function, still inside the namespace '\abc'. 
public function error_log($msg) 
{ 
    // this will be called from abc\Logger::error 
    // instead of the native error_log() function 
    echo "ERR: $msg, "; 
} 
1

è possibile utilizzare una funzione di quadro-beffarda come php-mock (ce ne sono anche altri) per deridere la chiamata a error_log (e controllare se si chiama con i parametri attesi).

Sfortunatamente non sarete in grado di usarlo per il die-construct in quanto non è una funzione normale ma un costrutto anlanguage.

mi piacerebbe sostituire il dado() con un 'throw new \ Exception()' (o qualsiasi altra eccezione dei casi) come si può quindi

  • banco di prova per l'eccezione generata e
  • può decidere nella tua programmazione se l'esecuzione deve essere interrotta quando si chiama il logger o se si desidera proseguire avvolgendo la chiamata in un try/catch

Ma mi chiederei anche se l'esecuzione deve fermarsi quando si chiama un logger

Problemi correlati