2012-07-05 6 views
7

Załóżmy, że mam działania:Yii testowanie jednostkowe działanie kontrolera bez selenu

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

Jaki jest prosty test jednostki dla tego działania, które będą zweryfikowania tekst na wyjściu widoku. Jest łatwy w strukturze Zend bez użycia selenu. Możemy stworzyć fałszywe GET i POST również w zend. Ale nie znalazłem tych samych przykładów w Yii. Proszę zasugeruj.

Odpowiedz

4

Framework Yii PHP jest bardzo dobry pod wieloma względami, ale jest bardzo smutny, że nie obsługuje wewnątrz żadnego symulowanego testowania wyjścia kontrolnego. Ma tylko selenowe metody przeglądarki internetowej. Przyszedłem do Yii z ZendF i zend ma dobre systemy testujące, w tym oparte na xpath. Musiałem więc zrozumieć przepływ kodu i zakodować go w moich komponentach/Controller.php. Można to zrobić bez zmiany jakichkolwiek podstawowych ram yii, które moim zdaniem są urokiem Yii.

Każdy kod klienta ma komponenty/Controller.php, które są wspólną podstawową klasą dla wszystkich kontrolerów w Yii. Renderowanie jest metodą CController, co oznacza, że ​​mogę ją przesłonić i przechwycić dane wyjściowe widoku do wykorzystania przez kod testowy jednostki.

Potrzebny byłby parametr runmode (w config/main.php), aby określić, czy jesteś testrun czy produkcja. W produkcji wyjściowej jest po prostu echo, podczas gdy nie możemy nic echo w testrun (tylko psuje raport z testu jednostkowego). W kodzie testowym otrzymasz dane wyjściowe w $ render_output, na którym możesz wykonać sprawdzanie pakietów xpath lub strpos. Ten hack nie jest najlepszy, ale działa dobrze.

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; 

}