2011-11-07 6 views
7

jestem testowania kontrolera w tym modzie:Symfony 2 w/phpunit 3,6: zmiana docelowego hosta dla celów testowych

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

Po print_r'ing obiekt $ gąsienicowy widzę, że docelowy adres URL jest http://localhost/lang/120. Jednak mój host docelowy jest hostem wirtualnym skonfigurowanym na moim komputerze, na przykład http://www.somehost.tld i chciałbym go użyć. Jakie czyste środki powinienem użyć, aby moje testy jednostek celowały w tego wirtualnego hosta?

Próbowałem umieszczenie zmiennej php w moim pliku phpunit.xml.dist i używać go:

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

, a następnie:

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

Ale to wygląda niewygodne ... Czy istnieje plik konfiguracyjny (plik config_test?), w którym powinienem umieścić tę wirtualną nazwę hosta?

Dzięki za pomoc, wszyscy!

Odpowiedz

6

Można ustawić te wartości jako parametry DIC (Dependency Injection Container) w config/config_test.yml.

Zasadniczo wystarczy dodać je tak:

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

Następnie można utworzyć metody pomocnika w klasie testowej, aby uzyskać adres URL do pewnego gospodarza:

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

Uwaga: będę załóż, że używasz WebTestCase.

Wreszcie wykorzystać to w swoim teście:

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

To brzmi dobrze, Igor, dzięki! Jednakże spowoduje to wywołanie właściwości Statystyczna właściwość \ .. \ .. \ LanguageControllerTest :: $ jako niestatycznej ... która jest rozwiązywana za pomocą "self :: $ kernel -> ..." – user772843

+0

Moja zła, wygląda to się zmieniło w pewnym momencie. Musi to rzeczywiście być self :: $ kernel. Naprawię moją odpowiedź. – igorw

12

Można także przekazać HTTP_HOST parametrów serwera, aby zmienić nazwę hosta docelowego:

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

Według igorw, jeśli masz nazwa hosta jako parametr w pliku konfiguracyjnym, na przykład:

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

W swojej WebTestCase można uzyskać nazwa hosta od parametrów i ustawić parametr HTTP_HOST do klienta:

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

W kodzie do przetestowania, przedmiot wniosek zawiera nazwę hosta:

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