Php symfony2控制器的功能测试:如何生成路由

Php symfony2控制器的功能测试:如何生成路由,php,unit-testing,symfony,controller,phpunit,Php,Unit Testing,Symfony,Controller,Phpunit,在symfony2控制器上,我想测试一个控制器,它返回一个响应对象。我的测试类扩展自WebTestCase。我使用static::createClient()获取一个可操作的客户端 我的问题是在我当前安装的虚拟主机上调用良好路由 $client->getContainer()->get('router')->generate('my_route',array(),true)以localhost作为主机生成路由。但这不起作用,因为我有myproject.local作为主机 $client->get

在symfony2控制器上,我想测试一个控制器,它返回一个
响应
对象。我的测试类扩展自
WebTestCase
。我使用
static::createClient()
获取一个可操作的客户端

我的问题是在我当前安装的虚拟主机上调用良好路由

$client->getContainer()->get('router')->generate('my_route',array(),true)
以localhost作为主机生成路由。但这不起作用,因为我有myproject.local作为主机

$client->getContainer()->get('kernel')->getRootDir()和其他dir方法提供linux文件路径,而不是web路径


我不能硬编码,因为我不是唯一一个参与这个项目的人。那么,获得正确路由的方法是什么,或者是否有其他方法来测试控制器?

Symfony2的内置测试框架(WebTestCase)只需要相对路径就可以在不同的环境中测试应用程序:

$client->getContainer()->get('router')->generate('my_route', array(), false);
Symfony模拟http客户端,并针对为该测试创建的内核实例进行测试。没有涉及web服务器

您可以在此处阅读有关客户端模拟如何工作的更多信息:

正如Symfony文档中提到的,您应该使用绝对URL,因为更改URL会影响最终用户,这也是您希望在功能测试中涵盖的内容

对请求URL进行硬编码是功能测试的最佳做法。如果测试使用Symfony路由器生成URL,则不会检测到对应用程序URL所做的任何可能影响最终用户的更改


请参阅此处的更多信息:

为什么要将
true
作为第三个参数传递给
generate
方法?您真的需要生成一个绝对URL吗?是的,因为默认URL也是通过本地主机链接的。或者我需要另一种方法来测试我的控制器。您不是在使用Symfony提供的测试客户端吗?是的,Symfony\Bundle\FrameworkBundle\test\WebTestCase中提供了这些客户端。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生变化,只有链接的答案可能会无效。嗨@serensat谢谢你的提示,我明白了。我刚刚加了对关键部分的引用。