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;
}