1

I have found a bunch of examples how to unit test Zend_Controller, but I'm looking for examples on Zend_Rest_Controller Unit Testing. Any help is really appreciated. Thank you!

eistrati
  • 2,314
  • 6
  • 26
  • 35
  • Isn't that a controller as well? What makes it so different to standard controllers that you can not use the standard testing for controllers? – hakre Jun 21 '11 at 20:17
  • Methods PUT and DELETE -- Please refer to [Rest on Wiki](http://en.wikipedia.org/wiki/Representational_State_Transfer) – eistrati Jun 21 '11 at 20:22
  • I know what rest is. What's the problem in testing PUT and DELETE? – hakre Jun 21 '11 at 20:33
  • 1
    Well, try it out by yourself and let me know if you succeed. I didn't place the question just in vain or just for fun ;) – eistrati Jun 21 '11 at 20:36
  • I assume so, point in case is just that you should make your problem a bit more specific otherwise I can only say: What's your problem? What does not work? Which error are you getting? What makes you think that it *should* work? – hakre Jun 21 '11 at 21:14
  • 1
    You're right, it not that different from regular Zend_Controller. It was my mistake! I thought to share some of my code, just in case... – eistrati Jun 22 '11 at 13:41

2 Answers2

1

So, basically your question is how to emulate calling PUT and DELETE in your controller tests?
Since this apparently doesn't work:

$this->request->setMethod('PUT');

You can access both these actions with plain HTTP POST by providing _method parameter.

So to call PUT:

$this->request->setMethod('POST');
$this->dispatch('articles/123?_method=put');

To call DELETE:

$this->request->setMethod('POST');
$this->dispatch('articles/123?_method=delete');

More reading on how to deal with RESTful routing here - http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.rest

Vika
  • 3,275
  • 18
  • 16
0
/**
 * 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
    }

}
Mike Graf
  • 5,077
  • 4
  • 45
  • 58
eistrati
  • 2,314
  • 6
  • 26
  • 35
  • Here is a good resource on how to create REST API in the first place: http://techchorus.net/create-restful-applications-using-zend-framework – eistrati Jun 22 '11 at 13:44