如何使用phpunit测试symfony2嵌入式控制器?

时间:2015-04-02 15:46:48

标签: unit-testing symfony controller phpunit functional-testing

我使用嵌入式控制器在侧面模板中生成动态内容(例如:菜单)

通常,我实现功能测试来断言控制器。 到目前为止,功能测试正在通过,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>

您对此有何看法?

2 个答案:

答案 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();

}