ZF2 Unit test album module returns routing issue
Question by Beniston
I am trying out the phpunit in the Zf2 album module. I encountered an error which states about routing.
Below is the debug information. It says ‘Route with name “album” not found’, but when I checked module.config.php in the album module folder, I see that is correctly set and in the browser the redirection to that route is working fine.
AlbumControllerAlbumControllerTest::testDeleteActionCanBeAccessed
ZendMvcRouterExceptionRuntimeException: Route with name "album" not found
D:wwwzend2vendorzendframeworkzendframeworklibraryZendMvcRouterSimpleRouteStack.php:292
D:wwwzend2vendorzendframeworkzendframeworklibraryZendMvcControllerPluginUrl.php:88
D:wwwzend2vendorzendframeworkzendframeworklibraryZendMvcControllerPluginRedirect.php:54
D:wwwzend2moduleAlbumsrcAlbumControllerAlbumController.php:80
D:wwwzend2vendorzendframeworkzendframeworklibraryZendMvcControllerAbstractActionController.php:87
D:wwwzend2vendorzendframeworkzendframeworklibraryZendEventManagerEventManager.php:468
D:wwwzend2vendorzendframeworkzendframeworklibraryZendEventManagerEventManager.php:208
D:wwwzend2vendorzendframeworkzendframeworklibraryZendMvcControllerAbstractController.php:108
D:wwwzend2testsmoduleAlbumsrcAlbumControllerAlbumControllerTest.php:35
C:wampbinphpphp5.4.3phpunit:46
I understand that the issue in AlbumController.php line 80 is
return $this->redirect()->toRoute('album');
But not sure why it is not working. Any one has encountered and overcome such issues?
Answer by dave b.
I hope it will save approx. 30 minutes of searching in the zend framework 2 code:
class AlbumControllerTest extends PHPUnit_Framework_TestCase
{
//...
protected function setUp()
{
$bootstrap = ZendMvcApplication::init(include 'config/application.config.php');
$this->controller = new AlbumController();
$this->request = new Request();
$this->routeMatch = new RouteMatch(array('controller' => 'index'));
$this->event = $bootstrap->getMvcEvent();
$router = new ZendMvcRouterSimpleRouteStack();
$options = array(
'route' => '/album[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'controller' => 'AlbumControllerAlbum',
'action' => 'index',
),
);
$route = ZendMvcRouterHttpSegment::factory($options);
$router->addRoute('album', $route);
$this->event->setRouter($router);
$this->event->setRouteMatch($this->routeMatch);
$this->controller->setEvent($this->event);
$this->controller->setEventManager($bootstrap->getEventManager());
$this->controller->setServiceLocator($bootstrap->getServiceManager());
}
}
Answer by Starx
Actually the easy way is to get the config data from the service manager:
$config = $serviceManager->get('Config');
Full code for the function setUp()
:
protected function setUp() {
$serviceManager = Bootstrap::getServiceManager();
$this -> controller = new AlbumController();
$this -> request = new Request();
$this -> routeMatch = new RouteMatch(
array(
'controller' => 'index',
)
);
$this -> event = new MvcEvent();
$config = $serviceManager->get('Config');
$routerConfig = isset($config['router']) ? $config['router'] : array();
$router = HttpRouter::factory($routerConfig);
$this -> event -> setRouter($router);
$this -> event -> setRouteMatch($this -> routeMatch);
$this -> controller -> setEvent($this -> event);
$this -> controller -> setServiceLocator($serviceManager);
}