2011-11-07 28 views
7

Tôi đang thử nghiệm một bộ điều khiển trong thời trang đó:Symfony 2 w/PHPUnit 3.6: thay đổi mục tiêu hostname cho mục đích thử nghiệm

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

Khi print_r'ing đối tượng $ bánh xích tôi có thể thấy rằng URL mục tiêu là http://localhost/lang/120. Tuy nhiên, máy chủ mục tiêu của tôi là một máy chủ ảo được thiết lập trên máy của tôi, giả sử http://www.somehost.tld và tôi muốn sử dụng nó. Tôi nên sử dụng phương tiện nào để kiểm tra đơn vị của mình để nhắm mục tiêu máy chủ ảo đó?

Tôi đã thử đặt một biến php trong file phpunit.xml.dist của tôi và sử dụng nó:

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

Và sau đó:

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

Nhưng trông vụng về ... Có tệp cấu hình (tệp config_test?) nơi tôi nên đặt tên máy chủ ảo đó?

Cảm ơn bạn đã trợ giúp, mọi người!

Trả lời

6

Bạn có thể đặt các giá trị đó làm tham số DIC (Dependency Injection Container) trong config/config_test.yml.

Về cơ bản chỉ cần thêm chúng như thế này:

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

Sau đó, bạn có thể tạo ra một phương pháp helper trên lớp thử nghiệm của bạn để có được url cho một máy chủ nào đó:

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

Lưu ý: Tôi sẽ giả sử bạn đang sử dụng WebTestCase.

Cuối cùng, tận dụng điều này trong thử nghiệm của bạn:

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

Đó là âm thanh tốt, Igor, cảm ơn! Tuy nhiên, điều này sẽ kích hoạt một thuộc tính tĩnh Accessing \ .. \ .. \ LanguageControllerTest :: $ kernel như non static ... được giải quyết bằng cách sử dụng "self :: $ kernel -> ..." – user772843

+0

điều này đã được thay đổi tại một số điểm. Nó phải thực sự bây giờ được tự :: $ hạt nhân. Sửa câu trả lời của tôi. – igorw

12

Bạn cũng có thể vượt qua HTTP_HOST trong các thông số máy chủ để thay đổi tên máy chủ mục tiêu:

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

Theo igorw, nếu bạn có tên máy chủ của bạn dưới dạng tham số trong tệp cấu hình, như:

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

Trong WebTestCase, bạn có thể nhận tên máy từ các thông số, và thiết lập các thông số HTTP_HOST cho khách hàng:

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

Trong mã của bạn để kiểm tra, đối tượng Request chứa hostname:

'http://www.myapp.com/lang/120' === $request->getUri(); 
Các vấn đề liên quan