2014-09-07 2 views
1

Symfony 번들에서 이벤트 리스너를 테스트하려면 어떻게해야합니까?테스트 컨트롤러 추가 및 테스트 이벤트 리스너

클라이언트 (테스트 요청 및 응답 받기)로 테스트 할 계획입니다. 하지만 내 번들에는 컨트롤러가 없습니다. 기능 테스트와 테스트 출력에서 ​​'특별'컨트롤러와 라우트를 추가 할 수 있습니까?

답변

2

테스트 용 컨트롤러를 추가하는 방법을 찾았습니다.

퍼스트 - 새로운 컨트롤러 클래스 (I는 %의는, bundleName의 %/테스트/컨트롤러를 생성)

퍼센트의는, bundleName %의은/테스트/컨트롤러/TestController.php

namespace %BundleName%\Tests\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 

class TestController extends Controller 
{ 
    public function rootAction() 
    { 
     return new Response('This is home page'); 
    } 

    public function galleryAction($id) 
    { 
     return new Response(sprintf('This is gallery %s', $id)); 
    } 
} 

그럼이 제어기를 이용 만들 시험 중.

%는, bundleName %의은/테스트/컨트롤러/PageControllerTest.php 각 시험 시작 setUpRoutes 방식에

namespace %BundleName%\Tests\Controller; 

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use Symfony\Component\Routing\Route; 

class PageControllerTest extends WebTestCase 
{ 
    /** 
    * @var \Symfony\Bundle\FrameworkBundle\Client 
    */ 
    private $client; 

    public function setUp() 
    { 
     $this->client = static::createClient(); 
     $this->client->followRedirects(true); 
     $this->setUpRoutes(); 
    } 

    public function testFirst() 
    { 
     $crawler = $this->client->request('GET', '/gallery/42'); 
    } 

    protected function setUpRoutes() 
    { 
     $container = $this->client->getContainer(); 

     /** @var \Symfony\Bundle\FrameworkBundle\Routing\Router $router */ 
     $router = $container->get('router'); 
     $collection = $router->getRouteCollection(); 

     foreach ($collection->all() as $routeId => $route) { 
      //Leave some routes if you need... 

      $collection->remove($routeId); 
     } 

     $controllerClassName = '\%BundleName%\Tests\Controller\TestController'; 

     $rootRoute = new Route('/', array('_controller' => sprintf('%s::%s', $controllerClassName, 'rootAction'))); 
     $galleryRoute = new Route('/gallery/{id}', array('_controller' => sprintf('%s::%s', $controllerClassName, 'galleryAction'))); 

     $collection->add('_test_root_route', $rootRoute); 
     $collection->add('_test_gallery_route', $galleryRoute); 
    } 
} 

라우팅리스트를 지우고 새로운 경로를 등록한다. 각 _controller 매개 변수 경로 값은 \%BundleName%\Tests\Controller\TestController::nameOfAction'입니다.