Symfony 2 w/PhpUnit 3.6:出于测试目的更改目标主机名

Symfony 2 w/PhpUnit 3.6:出于测试目的更改目标主机名,phpunit,symfony,Phpunit,Symfony,我正在以这种方式测试控制器: $crawler = $client->request('GET', 'lang/120'); 打印$crawler对象时,我可以看到目标URL为。但是,我的目标主机是在我的机器上设置的虚拟主机,我想使用它。我应该在单元测试中使用什么clean方法来针对该虚拟主机 我尝试在phpunit.xml.dist文件中放入一个php变量并使用它: <php> <server name="HOSTNAME" value="http://www

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

$crawler = $client->request('GET', 'lang/120');
打印$crawler对象时,我可以看到目标URL为。但是,我的目标主机是在我的机器上设置的虚拟主机,我想使用它。我应该在单元测试中使用什么clean方法来针对该虚拟主机

我尝试在phpunit.xml.dist文件中放入一个php变量并使用它:

<php>
    <server name="HOSTNAME" value="http://www.somehost.tld/app.php/" />
</php>
但这看起来很尴尬…有没有配置文件(配置测试文件?)我应该把虚拟主机名放在哪里


谢谢大家的帮助

您可以在
config/config\u test.yml
中将这些值设置为DIC(依赖注入容器)参数

基本上就是这样添加它们:

parameters:
    myapp.test.hostname.somehost: http://www.somehost.tld
    myapp.test.hostname.otherhost: https://www.otherhost.tld
然后,您可以在测试类上创建一个helper方法,以获取特定主机的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'));

您还可以在服务器参数中传递HTTP_主机以更改目标主机名:

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

根据igorw,如果您在配置文件中将主机名作为参数,如:

#config/config_test.yml
parameters:
    myapp_hostname: "http://www.myapp.com"
在WebTestCase中,您可以从参数获取主机名,并将HTTP_主机参数设置为客户端:

$client = self::createClient();
$hostname = $client->getContainer()->getParameter('myapp_hostname');
$client->setServerParameter('HTTP_HOST', $hostname );
$client->request('GET', '/lang/120');
在要测试的代码中,请求对象包含主机名:

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

听起来不错,伊戈尔,谢谢!但是,这将触发访问静态属性\..\..\LanguageControllerTest::$kernel作为非静态属性…这是通过使用“self::$kernel->…”解决的。我的错,看起来这在某个点上发生了更改。它现在必须是self::$kernel。修正我的答案。
'http://www.myapp.com/lang/120' === $request->getUri();