2012-09-25 11 views
5

¿Cómo puedo probar una redirección en una acción de controlador con PHPUnit?Zend Framework 2 ¿cómo probar la redirección en la acción del controlador?

class IndexControllerTest extends PHPUnit_Framework_TestCase 
{ 

    protected $_controller; 
    protected $_request; 
    protected $_response; 
    protected $_routeMatch; 
    protected $_event; 

    public function setUp() 
    { 
     $this->_controller = new IndexController; 
     $this->_request = new Request; 
     $this->_response = new Response; 
     $this->_routeMatch = new RouteMatch(array('controller' => 'index')); 
     $this->_routeMatch->setMatchedRouteName('default'); 
     $this->_event = new MvcEvent(); 
     $this->_event->setRouteMatch($this->_routeMatch); 
     $this->_controller->setEvent($this->_event); 
    } 

    public function testIndexActionRedirectsToLoginPageWhenNotLoggedIn() 
    { 
     $this->_controller->dispatch($this->_request, $this->_response); 
     $this->assertEquals(200, $this->_response->getStatusCode()); 
    } 

} 

El código anterior hace que este error al ejecutar pruebas unitarias:

Zend\Mvc\Exception\DomainException: Url plugin requires that controller event compose a router; none found 

Es porque estoy haciendo una redirección dentro de la acción del controlador. Si no hago un redireccionamiento, las pruebas unitarias funcionan. ¿Algunas ideas?

+0

parece eso mismo, un duplicado indirecta de http://stackoverflow.com/questions/12570377/how-can-i-pass-extra -parameters-to-the-routematch-object –

+1

Sugeriría buscar cómo crear una instancia del objeto del enrutador y luego agregarlo al MvcEvent ya que el complemento de URL lo requiere. Me imagino que un buen punto de partida sería la clase SimpleRouteStack, ya que implementa la interfaz que se está comprobando. – DrBeza

Respuesta

6

Esto es lo que tenía que hacer en la configuración:

public function setUp() 
{ 
    $this->_controller = new IndexController; 
    $this->_request = new Request; 
    $this->_response = new Response; 

    $this->_event = new MvcEvent(); 

    $routeStack = new SimpleRouteStack; 
    $route = new Segment('/admin/[:controller/[:action/]]'); 
    $routeStack->addRoute('admin', $route); 
    $this->_event->setRouter($routeStack); 

    $routeMatch = new RouteMatch(array('controller' => 'index', 'action' => 'index')); 
    $routeMatch->setMatchedRouteName('admin'); 
    $this->_event->setRouteMatch($routeMatch); 

    $this->_controller->setEvent($this->_event); 
} 
Cuestiones relacionadas