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

Posted

技术标签:

【中文标题】symfony2 控制器的功能测试:如何生成路由【英文标题】:Functional test of a symfony2 controller: How to generate a route 【发布时间】:2013-03-07 20:11:17 【问题描述】:

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

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

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

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

我无法对其进行硬编码,因为我并不孤单。那么有什么方法可以得到正确的路由,或者有没有其他方法可以测试控制器呢?

【问题讨论】:

为什么将true 作为第三个参数传递给generate 方法?您真的需要生成绝对 URL 吗? 是的,因为默认 url 也是通过 localhost 链接的。或者我需要另一种方法来测试我的控制器。 你不是在使用 Symfony 提供的测试客户端吗? 是的,这些在 Symfony\Bundle\FrameworkBundle\Test\WebTestCase 中可用 【参考方案1】:

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

$client->getContainer()->get('router')->generate('my_route', array(), false);

Symfony 模拟一个 http 客户端并针对为该测试创建的内核实例进行测试。不涉及网络服务器。

您可以在此处详细了解客户端模拟的工作原理: http://symfony.com/doc/current/book/testing.html#working-with-the-test-client

【讨论】:

【参考方案2】:

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

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

在此处查看更多信息:http://symfony.com/doc/current/book/testing.html#working-with-the-test-client

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 嗨@serensat 谢谢你的提示,我明白了。我只是添加了重要部分的引用。

以上是关于symfony2 控制器的功能测试:如何生成路由的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony2 中获取控制器的所有路由列表?

如何在Symfony2中获取控制器的所有路由列表?

symfony2 获取路由参数(控制器参数与请求)

Symfony2 / 路由 / 使用参数作为控制器或动作名称

找不到 Symfony2 突然登录路径

Symfony2:控制器中动作/路由的完整路径