【问题标题】:How to test a symfony2 embedded controller with phpunit?如何使用 phpunit 测试 symfony2 嵌入式控制器?
【发布时间】: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


【解决方案1】:

您的嵌入式控制器不存在于真空中。它们正在由您的主控制器中使用的模板加载。

我会说只检查主控制器就足够了。如果您真的想检查嵌入式控制器的不同输出,只需使用适当的参数测试主控制器。最后,将不同的值传递给嵌入式控制器的是主控制器。

【讨论】:

    【解决方案2】:

    由于渲染视图是响应,而您正在谈论单元测试, 我强烈建议对控制器进行单元测试,因为在某些项目中,控制器可以有很多逻辑。 我会对控制器的行为进行单元测试,因此它不会从控制器中的代码中抛出奇怪的错误。所以我建议你做的是在每个动作中为每个案例创建一个测试方法,你可能需要模拟控制器正在使用的一些对象,这里是一个例子:

    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();
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 2021-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-03-24
      • 2020-03-06
      • 2019-07-08
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多