2012-05-20 9 views
6

Ich habe eine App, die Sub-Domains auf dem Weg zu Agenturen verwendet:Wie ich testen Sub-Domain auf Basis Routen in Symfony2

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

diese jeweils entsprechen einer Agentur Einheit und Controller.

Ich habe einen Listener, der auf das onDomainParse-Ereignis wartet und die Subdomäne in die Anforderungsattribute schreibt.

/** 
* 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']); 
     } 

    } 
    //... 
} 

ich diese dann mit in der Steuerung zu einer Show Aktion zum Umleiten:

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 
     )); 
    } 
    // ... 

} 

Meine Frage ist:

Wie dies i fälschen, wenn ein Test mit WebTestCase tun?

Antwort

7

Besuchen Sie die Sub-Domain von HTTP zwingende Header für die Anforderung und Test für die rechte Seite:

Ungeprüfte, können Fehler

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 war es auch in der [Docs] (http://symfony.com/doc/current/book/testing.html#testing-configuration). Vielen Dank – max

7

Basierend auf den Symfony docs auf Host-basierte Routen enthalten, Testing your Controllers:

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

Wenn Sie mit Array-Parameter-Pad alle Ihre Anfragen nicht wollen, t sein könnte besser sein:

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

... 

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

Es gibt auch eine setServerParameters() Methode auf dem Client, wenn Sie ein paar Parameter zu ändern.