2012-07-05 12 views
7

Supponiamo di avere un'azione:yii azione di controllo unit test senza selenio

function actionShowItem($id) 
{ 
    $item = Item::model()->findByPk($id); 
    $this->render("showitem",array('model' => $id)); 
} 

Qual è la semplice test unità per questa azione che verificherà testo nell'output vista. È facile nella struttura zend senza usare selenio. Potremmo creare finti GET e POST anche in zend. Ma non ho trovato gli stessi esempi in Yii. Si prega di suggerire.

risposta

4

Il framework PHP di Yii è molto buono sotto molti aspetti, ma è molto triste che non supporti internamente alcun tipo di test di output simulato di azione del controller. Ha solo metodi di browser Web basati sul selenio. Sono arrivato a Yii da ZendF e Zend ha dei buoni sistemi di test che includono asserzioni basate su xpath. Quindi ho dovuto capire il flusso del codice e codificarlo all'interno dei miei componenti/Controller.php. Potrebbe essere fatto senza modificare alcun framework yii di base che, secondo me, è il fascino di Yii.

Ogni codice client ha componenti/Controller.php che è una classe base comune per tutti i controller in Yii. E render è un metodo CController che significa che posso sovrascriverlo e catturare l'output di visualizzazione per l'utilizzo dal codice di test dell'unità.

Avresti bisogno di un parametro runmode (in config/main.php) per identificare se sei un test o una produzione. Nell'output di produzione viene semplicemente echeggiato mentre non riusciamo ad echeggiare nulla in testrun (rovina semplicemente il report del test unitario). Nel codice di test si ottiene l'output in $ rendering_output su cui è possibile eseguire asserimenti wrapper xpath o strpos. Questo hack non è il massimo, ma fa bene il lavoro.

function render($view,$data=null,$return=false) 
{ 
    $out = parent::render($view,$data,true); 

    if(isset(Yii::app()->params['runmode']) 
     && Yii::app()->params['runmode'] == 'test') 
    { 
     global $render_output; 
     return $render_output = $out; 
    } 

    if($return) 
     return $out; 
    else 
     echo $out; 

}