2011-11-07 20 views
7

我以那種方式測試控制器:Symfony的2W/PHPUnit的3.6:更改目標主機名用於測試目的

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

在print_r'ing的$履帶式對象,我可以看到的目標URL是http://localhost/lang/120。但是,我的目標主機是在我的機器上設置的虛擬主機,比如http://www.somehost.tld,我想使用它。我應該使用什麼乾淨的手段來進行單元測試來定位該虛擬主機?

我試圖把一個PHP變量在我phpunit.xml.dist文件並使用它:

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

然後:

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

但是看起來很笨拙......有什麼配置文件(config_test文件?),我應該把這個虛擬主機名?

感謝您的幫助,每個人!

回答

6

您可以將這些值設置爲config/config_test.yml中的DIC(依賴注入容器)參數。

基本上只是添加它們是這樣的:

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

然後你就可以創建你的測試類的輔助方法,以便獲得url某臺主機:

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

注:我會假定您正在使用WebTestCase

最後,利用這個在您的測試:

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

聽起來不錯,伊戈爾,謝謝!但是,這將觸發一個訪問靜態屬性\ .. \ .. \ LanguageControllerTest :: $內核作爲非靜態的...這是通過使用「self :: $內核 - > ...」 – user772843

+0

解決我的不好,看起來像這在一些時候已經改變了。它現在確實應該是self :: $ kernel。修復我的答案。 – igorw

12

您也可以通過HTTP_HOST服務器參數更改目標主機名:

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

據igorw,如果你有您的主機名作爲配置文件中的參數,如:

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

在您的WebTestCase中,您可以獲取從參數的主機名,並設置HTTP_HOST參數到客戶端:

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

在你的代碼來測試,Request對象包含主機名:

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