Symfony 2 w / PhpUnit 3.6:更改目标主机名以进行测试

时间:2011-11-07 15:37:42

标签: phpunit symfony

我正在以这种方式测试控制器:

$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文件?)我应该放置那个虚拟主机名?

感谢大家的帮助!

3 个答案:

答案 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();