2012-02-06 12 views
6

ho una console app, (scritto come un comando di Symfony2), che sta leggendo l'input da utente tramite STDIN e con l'aiuto di readline, l'input dell'utente è poi passato a eval()Come scrivere unità di test per la console interattiva app

Il tutto è solo per avere "debug shell" (qualcosa come un php -a) ma all'interno del progetto env e accesso al contenitore di iniezione delle dipendenze.

Vorrei scrivere test di unità per questo comando ma sto colpendo wall, su come (ed è possibile) scrivere test PHPUnit per questo comportamento?

risposta

7

Non ho dimestichezza con la cosa SF2 comando, ma la documentazione SF2 avere un esempio su testarlo a http://symfony.com/doc/2.0/components/console.html#testing-commands

In generale, si potrebbe separare STDIN e STDOUT dalla console app in modo da poter sostituire con un'altra risorsa di streaming, ad esempio fopen(php://memory). Invece di readline, si utilizza

fwrite($outputStream, 'Prompt'); 
$line = stream_get_line($inputStream, 1024, PHP_EOL); 

L'idea è di rendere il componente testabile senza richiedere l'ambiente console vera e propria. L'utilizzo di questo approccio consente di verificare il contenuto dello Stream in qualsiasi momento nel test. So if you run Command "foo" in your console app and want to test that the output is "bar" you simply rewind the appropriate resource and read it's content. Un'alternativa sarebbe utilizzare SplTempFileObject.

class ConsoleApp 
… 
    public function __construct($inputStream, $outputStream) 
    { 
     $this->inputStream = $inputStream; 
     $this->outputStream = $outputStream; 
    } 
} 

nello scenario del mondo reale che ci si crea la console app con

$app = new ConsoleApp(STDIN, STDOUT); 

Ma nel tuo test è possibile impostare la ConsoleApp con un flusso di vostra scelta:

public function setup() 
{ 
    $i = fopen('php://memory', 'w'); 
    $o = fopen('php://memory', 'w'); 
    $this->consoleApp = new ConsoleApp($i, $o); 
} 

Un esempio di UnitTest che utilizza questo metodo per l'outstream sarebbe

+1

Grazie mille :) – canni

Problemi correlati