Я пытался узнать, как использовать модульное тестирование в CakePhp, я пытаюсь написать контрольный тест. Я читал о функции testAction () и debug (), но для меня это не работает, я имею в виду, что метод тестирования проходит, но debug () возвращает null (потому что testAction делает)
Это мой код:
<?php App::uses('Controller', 'Controller'); App::uses('View', 'View'); App::uses('PostsController', 'Controller'); class PostsControllerTest extends ControllerTestCase { public function setUp() { parent::setUp(); $Controller = new Controller(); $View = new View($Controller); $this->Posts = new PostsController($View); } public function testIndex() { $result = $this->testAction('Posts/Index'); debug($result); } }
Сообщения / индексный контроллер возвращает список всех сообщений, хранящихся в БД.
Я предполагаю, что вы используете CakePHP 2.
$this->testAction()
может возвращать несколько разных результатов, в зависимости от параметров, которые вы ему даете.
Например, если вы установите параметр return
в vars
, метод testAction()
вернет массив варов, которые были установлены в тестируемом действии:
public function testIndex() { $result = $this->testAction('/posts/index', array('return' => 'vars')); debug($result); }
В этом примере данные отладки должны быть массивом варов, которые вы установили в действии /posts/index
.
Документация CakePHP описывает возможные результаты, которые вы можете вернуть здесь: http://book.cakephp.org/2.0/en/development/testing.html#choosing-the-return-type
Обратите внимание, что параметр по умолчанию, result
, дает вам значение, которое возвращает действие вашего контроллера. Для большинства действий контроллера это будет null
, поэтому ожидается, что вы получите null
в своем примере.
Ответ mtnorthrop действительно сработал для меня, но только однажды я также имел дело с авторизацией моего сайта. Если ваш сайт использует авторизацию, то testAction ('/ action', array ('return' => 'contents') вернет null. Я видел несколько решений для этого:
Один из них заключается в том, чтобы следовать приведенному здесь решению: CakePHP Unit Test не возвращает содержимое или View, где вы проверяете AppController :: beforeFilter (), находитесь ли вы в режиме отладки и если да, всегда проверяйте подлинность пользователя:
// For Mock Objects and Debug >= 2 allow all (this is for PHPUnit Tests) if(preg_match('/Mock_/',get_class($this)) && Configure::read('debug') >= 2){ $this->Auth->allow(); }
Другим является следовать рекомендациям, приведенным в этом обсуждении: https://groups.google.com/forum/#!topic/cake-php/eWCO2bf5t98 и высмеять объект Auth с помощью функции генерации ControllerTestCase:
class MyControllerTest extends ControllerTestCase { public function setUp() { parent::setUp(); $this->controller = $this->generate('My', array('components' => array( 'Auth' => array('isAuthorized') )) ); $this->controller->Auth->expects($this->any()) ->method('isAuthorized') ->will($this->returnValue(true)); } }
Примечание (я использую CakePhp 2.3.8)