Тестирование контроллеров
Создание тестовой оболочки
Допустим, у нас есть типичный контроллер, с соответствующей моделью:
<?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
Установите, что вы хотите вернуть
Допустимые значения:
- 'vars' – Вы получите отображение переменных, доступных после выполнения действия
- 'view' – Вы получите отрендеренное отображение без шаблона (верстки)
- 'contents' – Вы получите весь html-код отображения, включая верстку
- 'result' – Вы получите возвращенное значение, когда действие использует $this->params['requested'].
По умолчанию – 'result'.
fixturize
Установите в true, если вы хотите, чтобы ваши модели автоматически прикреплялись (т.е. таблицы приложения копировались вместе с их содержимым в тестовые таблицы. Таким образом при изменение данных, реальные данные не пострадают). Если вы присвоите 'fixturize' массив моделей, тогда только эти модели будут автоматически прикрепляться, в то время, как другие останутся с рабочими таблицами. Если вы хотите использовать ваши файлы прикреплений в testAction(), то не используйте 'fixturize', а просто используйте прикрепления, как обычно.
method
установите в 'post' или 'get' если вы хотите передать данные в контроллер
data
данные для передачи. Присвойте ассоциативный массив, содержащий fields => value. Посмотрите функцию testIndexPostFixturized() в тесте выше, чтобы увидеть как мы эмулируем вставку данных из формы для новой статьи.
Ловушка
Если вы используете testAction для тестирования метода, который делает перенаправление (redirect), то ваш тест немедленно завершится, не вернув никаких результатов. Смотрите
https://trac.cakephp.org/ticket/4154.
<< Тестирование моделей |
Тестирование помощников >>