我正在使用嵌入式控制器在侧面模板中生成动态内容(例如:菜单)如何用phpunit测试symfony2嵌入式控制器?
通常,我执行函数测试来断言控制器。 到目前为止,functionnal测试通过,phpunit认为我的嵌入式控制器代码覆盖
我想知道如何测试嵌入式控制器不同的输入和评估输出......是单元测试的权利?
我知道单元测试控制器是一个不好的做法,但是如何在没有请求对象时测试嵌入式控制器? 路由/ 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>
你对这个想法?
我想,一般你不应该试图以这种方式嵌入控制器的输出。你有没有检出https://github.com/KnpLabs/KnpMenuBundle? – nateevans 2015-04-02 21:19:42
感谢您的评论。我使用原则,可翻译,sluggable和树来生成我的i18n超链接。据我所知,KnpMenuBundle只使用翻译文件。我的代码很明确,只使用一个控制器函数和一个模板,所以我没有看到需要实现一个服务并对其进行自定义。嵌入式控制器应该如何实现? – x0s 2015-04-03 08:10:54
在我与Symfony核心成员和主要文档编写人员Ryan Weaver的培训中,他通常不鼓励我以非标准方式使用控制器作为约定。但是我试图做一些事情,比如从另一个Controller中调用Controller。坏juju。回到你原来的问题,我认为你可以测试你的嵌入式控制器所在的路线。请参阅http://symfony.com/doc/current/book/testing.html#your-first-functional-test。您可以传递不同的参数,并根据您的请求使用搜寻器查找预期的输出 – nateevans 2015-04-06 19:26:02