Я нашел кучу примеров, как выполнить модульный тест Zend_Controller, но я ищу примеры для Zend_Rest_Controller Unit Testing. Любая помощь действительно ценится. Спасибо!
Итак, в основном ваш вопрос заключается в том, как эмулировать вызовы PUT
и DELETE
в тестах вашего контроллера?
Поскольку это, по-видимому, не работает:
$this->request->setMethod('PUT');
Вы можете получить доступ к этим действиям с помощью простого HTTP POST
, _method
параметр _method
.
Поэтому для вызова PUT
:
$this->request->setMethod('POST'); $this->dispatch('articles/123?_method=put');
Чтобы позвонить DELETE
:
$this->request->setMethod('POST'); $this->dispatch('articles/123?_method=delete');
Подробнее о том, как обращаться с маршрутизацией RESTful здесь – http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.rest
/** * Sample class to test a controller */ class ArticleControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public $bootstrap; public function setUp() { // When bootstrap is called it will run function 'appBootstrap' $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function appBootstrap() { $this->application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'); $this->application->bootstrap(); $bootstrap = $this->application->getBootstrap(); $front = $bootstrap->getResource('FrontController'); $front->setParam('bootstrap', $bootstrap); } public function tearDown() { Zend_Controller_Front::getInstance()->resetInstance(); $this->resetRequest(); $this->resetResponse(); parent::tearDown(); } public function testIndexAction() { $testCases = array( '/article/', '/article/id/123/', '/article/authorId/777/limit/5/', '/article/commentId/999/startDate/2011-06-01/endDate/2011-06-01/', ); foreach ($testCases as $url) { $this->request->setHeader('Content-Type', 'text/json'); $this->dispatch($url); $this->assertResponseCode(200); $this->assertModule('default'); $this->assertController('article'); $this->assertAction('get'); $body = json_decode($this->response->getBody(), true); $this->assertNotEmpty($body); ... $this->resetRequest(); $this->resetResponse(); } } public function testGetAction() { // Same as $this->testIndexAction() } public function testPostAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('POST'); before dispatch // Change $this->assertResponseCode(200); to 201 as REST requires } public function testPutAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('PUT'); before dispatch } public function testDeleteAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('DELETE'); before dispatch } }
по/** * Sample class to test a controller */ class ArticleControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public $bootstrap; public function setUp() { // When bootstrap is called it will run function 'appBootstrap' $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function appBootstrap() { $this->application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini'); $this->application->bootstrap(); $bootstrap = $this->application->getBootstrap(); $front = $bootstrap->getResource('FrontController'); $front->setParam('bootstrap', $bootstrap); } public function tearDown() { Zend_Controller_Front::getInstance()->resetInstance(); $this->resetRequest(); $this->resetResponse(); parent::tearDown(); } public function testIndexAction() { $testCases = array( '/article/', '/article/id/123/', '/article/authorId/777/limit/5/', '/article/commentId/999/startDate/2011-06-01/endDate/2011-06-01/', ); foreach ($testCases as $url) { $this->request->setHeader('Content-Type', 'text/json'); $this->dispatch($url); $this->assertResponseCode(200); $this->assertModule('default'); $this->assertController('article'); $this->assertAction('get'); $body = json_decode($this->response->getBody(), true); $this->assertNotEmpty($body); ... $this->resetRequest(); $this->resetResponse(); } } public function testGetAction() { // Same as $this->testIndexAction() } public function testPostAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('POST'); before dispatch // Change $this->assertResponseCode(200); to 201 as REST requires } public function testPutAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('PUT'); before dispatch } public function testDeleteAction() { // Similar to $this->testIndexAction() // Add $this->request->setMethod('DELETE'); before dispatch } }