我使用嵌入式控制器在侧面模板中生成动态内容(例如:菜单)
通常,我实现功能测试来断言控制器。 到目前为止,功能测试正在通过,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>
您对此有何看法?
答案 0 :(得分:0)
您的嵌入式控制器不存在于真空中。它们由主控制器中使用的模板加载。
我想说只检查主控制器就足够了。如果你真的想检查嵌入式控制器的不同输出,只需用适当的参数测试主控制器。最后,它是主控制器,为嵌入式控制器提供不同的值。
答案 1 :(得分:0)
由于渲染视图是响应,而你在谈论单元测试, 我强烈建议对控制器进行单元测试,因为在某些项目中控制器可以有很多逻辑。 我会将控制器单元测试其行为,因此它不会从控制器中的代码中抛出奇怪的错误。所以我建议你做的是为每个动作中的每个案例创建一个测试方法,你可能需要模拟控制器正在使用的一些对象,这是一个例子:
public function testIndexAction()
{
$this->employeeRepository->expects($this->once())->method('findByFilter')->will($this->returnValue($this->employee));
$this->entityManager->expects($this->once())->method('getRepository')->will(
$this->returnValue($this->employeeRepository)
);
$this->employeeManager->expects($this->once())->method('formatEmployeeData')->will(
$this->returnValue($this->formattedJson)
);
$this->mockContainer($this->object);
$this->object->indexAction();
}