【发布时间】:2015-06-07 15:41:29
【问题描述】:
我正在使用嵌入式控制器在侧面模板中生成动态内容(例如:菜单)
通常,我实现功能测试来断言控制器。 到目前为止,功能测试正在通过,phpunit 认为我的嵌入式控制器代码已覆盖
我想知道如何使用不同的输入测试嵌入式控制器并评估输出...单元测试对吗?
我知道单元测试控制器是一种不好的做法,但是当没有请求对象时如何对嵌入式控制器进行功能测试? route/url 是 Twig 的 render() 函数负责处理的。
{{ render(controller('AppSuperBundle:Default:generateMenu', {'params': ... } )) }}
举例说明:
class DefaultController extends Controller
{
public function testAction()
{
return $this->render('AppSuperBundle::index.html.twig');
}
public function generateMenuAction($route, Array $RouteParams)
{
$repo = $this->getDoctrine()->getRepository(...
//some process to generate params of menu items (eg:locale, url, name...)
return $this->render('AppSuperBundle::menu.html.twig', array('menuItems' => $menuItemsWithParams));
}
}
模板index.html.twig
<html>
<body>
{% block menu %}
{{ render(controller('AppSuperBundle:Default:generateMenu', {'route': app.request.attributes.get('_route'), 'RouteParams': app.request.attributes.get('_route_params')} )) }}
{% endblock %}
{% block content %}
...
{% endblock %}
</body>
</html>
您对此有何看法?
【问题讨论】:
-
我认为,一般你不应该尝试以这种方式嵌入控制器的输出。你检查过github.com/KnpLabs/KnpMenuBundle 吗?
-
感谢您的评论。我使用教义、可翻译、sluggable 和树来生成我的 i18n 超链接。据我所知,KnpMenuBundle 只使用翻译文件。我的代码很清晰,只使用一个控制器功能和一个模板,所以我认为不需要实现服务和自定义它。应该采用哪种方式实现嵌入式控制器?
-
在我与 Symfony 核心成员和主要文档作者 Ryan Weaver 的培训中,他通常不鼓励我按照惯例以非标准方式使用控制器。但我试图做一些事情,比如调用来自另一个控制器的控制器。坏朱朱。回到你原来的问题,我认为你可以测试你的嵌入式控制器所在的路由。见symfony.com/doc/current/book/…。您可以传递不同的参数,并使用爬虫根据您的请求找到预期的输出
标签: unit-testing symfony controller phpunit functional-testing