我正在以这种方式测试控制器:
$crawler = $client->request('GET', 'lang/120');
在print_r'ing $ crawler对象后,我可以看到目标网址为http://localhost/lang/120。但是,我的目标主机是在我的机器上设置的虚拟主机,假设为http://www.somehost.tld,我想使用它。我应该使用什么干净的方法进行单元测试来定位虚拟主机?
我已经尝试在我的phpunit.xml.dist文件中放入一个php变量并使用它:
<php>
<server name="HOSTNAME" value="http://www.somehost.tld/app.php/" />
</php>
然后:
$crawler = $client->request('GET', $_SERVER['HOSTNAME'] . 'lang/120');
但是看起来很尴尬......有没有配置文件(config_test文件?)我应该放置那个虚拟主机名?
感谢大家的帮助!
答案 0 :(得分:12)
您还可以在服务器参数中传递HTTP_HOST以更改目标主机名:
self::createClient(array(), array(
'HTTP_HOST' => 'sample.host.com',
));
答案 1 :(得分: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'));
答案 2 :(得分:2)
According to igorw, if you have your hostname as parameter in a config file, like :
#config/config_test.yml
parameters:
myapp_hostname: "http://www.myapp.com"
In your WebTestCase, you can get the hostname from parameters, and set the HTTP_HOST parameter to client :
$client = self::createClient();
$hostname = $client->getContainer()->getParameter('myapp_hostname');
$client->setServerParameter('HTTP_HOST', $hostname );
$client->request('GET', '/lang/120');
In your code to test, the Request object contains the hostname :
'http://www.myapp.com/lang/120' === $request->getUri();