2011-11-07 3 views
7

sto testando un controller in quel modo:Symfony 2 w/phpunit 3.6: cambiando nome host di destinazione per scopi di test

$crawler = $client->request('GET', 'lang/120'); 

Su print_r'ing l'oggetto $ crawler posso vedere che l'URL di destinazione è http://localhost/lang/120. Tuttavia, il mio host di destinazione è un host virtuale configurato sulla mia macchina, diciamo http://www.somehost.tld e mi piacerebbe usarlo. Quali mezzi puliti dovrei usare per i miei test di unità per indirizzare l'host virtuale?

Ho provato a mettere una variabile php nel mio file phpunit.xml.dist e usarlo:

<php> 
    <server name="HOSTNAME" value="http://www.somehost.tld/app.php/" /> 
</php> 

E poi:

$crawler = $client->request('GET', $_SERVER['HOSTNAME'] . 'lang/120'); 

Ma che sembra imbarazzante ... c'è qualche file di configurazione (il file config_test?) dove dovrei inserire il nome host virtuale?

Grazie per l'aiuto, a tutti!

risposta

6

È possibile impostare tali valori come parametri DIC (contenitore di iniezione delle dipendenze) in config/config_test.yml.

In pratica basta aggiungere in questo modo:

parameters: 
    myapp.test.hostname.somehost: http://www.somehost.tld 
    myapp.test.hostname.otherhost: https://www.otherhost.tld 

Quindi è possibile creare un metodo di supporto sulla vostra classe di test per ottenere l'url per un determinato host:

private function getHostUrl($hostId, $path = '') 
{ 
    return self::$kernel->getContainer()->getParameter('myapp.test.hostname.'.$hostId).$path; 
} 

Nota: I'LL supponiamo che tu stia usando il WebTestCase.

Infine, fare uso di questo nel tuo test:

$crawler = $client->request('GET', $this->getHostUrl('somehost', '/lang/120')); 
+0

che suona bene, Igor, grazie! Tuttavia, ciò attiverebbe una proprietà statica di accesso \ .. \ .. \ LanguageControllerTest :: $ come non statico ... che viene risolto usando "self :: $ kernel -> ..." – user772843

+0

Il mio male, sembra questo è stato cambiato ad un certo punto. Deve infatti essere ora self :: $ kernel. Risolvendo la mia risposta. – igorw

12

È possibile anche passare HTTP_HOST in parametri del server per modificare il nome host di destinazione:

self::createClient(array(), array(
    'HTTP_HOST' => 'sample.host.com', 
)); 
2

Secondo igorw, se avete il nome host come parametro in un file di configurazione, come:

#config/config_test.yml 
parameters: 
    myapp_hostname: "http://www.myapp.com" 

nella tua WebTestCase, è possibile ottenere il nome host dai parametri, e impostare il parametro HTTP_HOST al cliente:

$client = self::createClient(); 
$hostname = $client->getContainer()->getParameter('myapp_hostname'); 
$client->setServerParameter('HTTP_HOST', $hostname); 
$client->request('GET', '/lang/120'); 

Nel codice per testare, l'oggetto richiesta contiene l'hostname:

'http://www.myapp.com/lang/120' === $request->getUri();