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.

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