2012-05-20 9 views
6

Tengo una aplicación que utiliza subdominios para encaminar a las agencias:¿Cómo puedo probar rutas basadas en el subdominio Symfony2

foo.domain.dev -> Agency:showAction(foo) 
bar.domain.dev -> Agency:showAction(bar) 
domain.dev  -> Agency:indexAction() 

Estos corresponden cada uno a una entidad Agencia y el controlador.

Tengo un oyente que escucha el evento onDomainParse y escribe el subdominio en los atributos de solicitud.

/** 
* Listens for on domainParse event 
* Writes to request attributes 
*/ 
class SubdomainListener { 
    public function onDomainParse(Event $event) 
    { 
     $request = $event->getRequest(); 
     $session = $request->getSession(); 
     // Split the host name into tokens 
     $tokens = $this->tokenizeHost($request->getHost()); 

     if (isset($tokens['subdomain'])){ 
      $request->attributes->set('_subdomain',$tokens['subdomain']); 
     } 

    } 
    //... 
} 

entonces yo uso esto en el controlador para redireccionar a una acción show:

class AgencyController extends Controller 
{ 

    /** 
    * Lists all Agency entities. 
    * 
    */ 
    public function indexAction() 
    { 
     // We reroute to show action here. 
     $subdomain = $this->getRequest() 
         ->attributes 
         ->get('_subdomain'); 
     if ($subdomain) 
      return $this->showAction($subdomain); 


     $em = $this->getDoctrine()->getEntityManager(); 

     $agencies = $em->getRepository('NordRvisnCoreBundle:Agency')->findAll(); 

     return $this->render('NordRvisnCoreBundle:Agency:index.html.twig', array(
      'agencies' => $agencies 
     )); 
    } 
    // ... 

} 

Mi pregunta es:

¿Cómo puedo falsa esta cuando se hace una prueba con WebTestCase?

Respuesta

7

Visita el subdominio anulando las cabeceras HTTP para la solicitud y la prueba de la página de la derecha:

No comprobado, puede contener errores

class AgencyControllerTest extends WebTestCase 
{ 
    public function testShowFoo() 
    { 
     $client = static::createClient(); 

     $crawler = $client->request('GET', '/', array(), array(), array(
      'HTTP_HOST'  => 'foo.domain.dev', 
      'HTTP_USER_AGENT' => 'Symfony/2.0', 
     )); 

     $this->assertGreaterThan(0, $crawler->filter('html:contains("Text of foo domain")')->count()); 
    } 
} 
+0

Ah, estaba en [docs] (http://symfony.com/doc/current/book/testing.html#testing-configuration) también. Gracias – max

7

Sobre la base de los documentos de Symfony en las rutas basadas en host, Testing your Controllers:

$crawler = $client->request(
    'GET', 
    '/', 
    array(), 
    array(), 
    array('HTTP_HOST' => 'foo.domain.dev') 
); 

Si no desea almohadilla de todas sus peticiones con parámetros de matriz, t su podría ser mejor:

$client->setServerParameter('HTTP_HOST', 'foo.domain.dev'); 
$crawler = $client->request('GET', '/'); 

... 

$crawler2 = $client->request('GET', /foo'); // still sends the HTTP_HOST 

También hay un método setServerParameters() en el cliente, si usted tiene unos pocos parámetros para el cambio.

Cuestiones relacionadas