CakePHP : Manual/CommonTasks/Testing/TestingControllers

Тестирование контроллеров

Создание тестовой оболочки


Допустим, у нас есть типичный контроллер, с соответствующей моделью:

<?php 
class ArticlesController extends AppController 
   var 
$name 'Articles'
   var 
$helpers = array('Ajax''Form''Html'); 
   
   function 
index($short null) { 
     if (!empty(
$this->data)) { 
       
$this->Article->save($this->data); 
     } 
     if (!empty(
$short)) { 
       
$result $this->Article->findAll(null, array('id'
          
'title')); 
     } else { 
       
$result $this->Article->findAll(); 
     } 
 
     if (isset(
$this->params['requested'])) { 
       return 
$result
     } 
 
     
$this->set('title''Articles'); 
     
$this->set('articles'$result); 
   } 

?>


Создадим файл articles_controller.test.php в каталоге app/tests/cases/controllers и поместим в него следующее:

<?php 
class ArticlesControllerTest extends CakeTestCase 
   function 
startCase() { 
     echo 
'<h1>Starting Test Case</h1>'
   } 
   function 
endCase() { 
     echo 
'<h1>Ending Test Case</h1>'
   } 
   function 
startTest($method) { 
     echo 
'<h3>Starting method ' $method '</h3>'
   } 
   function 
endTest($method) { 
     echo 
'<hr />'
   } 
   function 
testIndex() { 
     
$result $this->testAction('/articles/index'); 
     
debug($result); 
   } 
   function 
testIndexShort() { 
     
$result $this->testAction('/articles/index/short'); 
     
debug($result); 
   } 
   function 
testIndexShortGetRenderedHtml() { 
     
$result $this->testAction('/articles/index/short'
     array(
'return' => 'render')); 
     
debug(htmlentities($result)); 
   } 
   function 
testIndexShortGetViewVars() { 
     
$result $this->testAction('/articles/index/short'
     array(
'return' => 'vars')); 
     
debug($result); 
   } 
   function 
testIndexFixturized() { 
     
$result $this->testAction('/articles/index/short'
     array(
'fixturize' => true)); 
     
debug($result); 
   } 
   function 
testIndexPostFixturized() { 
     
$data = array('Article' => array('user_id' => 1'published' 
          
=> 1'slug'=>'new-article''title' => 'New Article''body' => 'New Body')); 
     
$result $this->testAction('/articles/index'
     array(
'fixturize' => true'data' => $data'method' => 'post')); 
     
debug($result); 
   } 

?>



Метод testAction


Первый аргумент метода – Cake url действия контроллера, которое будет тестироваться, например '/articles/index/short'.

Второй аргумент – это массив параметров, состоящий из:


return
Установите, что вы хотите вернуть
Допустимые значения:
По умолчанию – 'result'.
fixturize
Установите в true, если вы хотите, чтобы ваши модели автоматически прикреплялись (т.е. таблицы приложения копировались вместе с их содержимым в тестовые таблицы. Таким образом при изменение данных, реальные данные не пострадают). Если вы присвоите 'fixturize' массив моделей, тогда только эти модели будут автоматически прикрепляться, в то время, как другие останутся с рабочими таблицами. Если вы хотите использовать ваши файлы прикреплений в testAction(), то не используйте 'fixturize', а просто используйте прикрепления, как обычно.
method
установите в 'post' или 'get' если вы хотите передать данные в контроллер
data
данные для передачи. Присвойте ассоциативный массив, содержащий fields => value. Посмотрите функцию testIndexPostFixturized() в тесте выше, чтобы увидеть как мы эмулируем вставку данных из формы для новой статьи.

Ловушка


Если вы используете testAction для тестирования метода, который делает перенаправление (redirect), то ваш тест немедленно завершится, не вернув никаких результатов. Смотрите https://trac.cakephp.org/ticket/4154.

<< Тестирование моделей | Тестирование помощников >>