【问题标题】:Controller unit testing symfony2控制器单元测试 symfony2
【发布时间】:2015-09-21 17:25:34
【问题描述】:

我是单元测试用例的新手,我只有一个功能

 /**
 * Creates a new Blog entity.
 *
 * @Route("/", name="blog_create")
 * @Method("POST")
 * @Template("AppBundle:Blog:new.html.twig")
 */
public function createAction(Request $request)
{
    $entity = new Blog();
    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('blog_show', array('id' => $entity->getId())));
    }

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
} // End of method

在数据库中创建条目。问题是我无法编写测试用例来验证表单提交的输入,即使我尝试创建控制器的对象并将实体传递给该对象。我不知道如何在测试用例中创建控制器对象并且 如何验证输入表单和视图,有什么想法吗? I'm looking for a solution like this.

【问题讨论】:

  • 也许只是对您的验证进行单元测试。
  • 你看过那篇文章开头的评论了吗?对控制器进行单元测试没有意义。尝试功能测试symfony.com/doc/current/book/testing.html#forms
  • 恕我直言,我不认为单元测试控制器是不合适的。功能测试很重要,但它们对于测试一整套边界条件并不那么好,功能测试最适合测试一个“快乐”路径和一个“不快乐”路径,有效地测试层之间的“胶水”是否有效.现在确实控制器应该尽可能瘦,所以不应该有太多的逻辑,但总有一些,如问题中所见。显然有赞成和反对的论据,但我认为直截了当的“不要这样做”并没有多大帮助。

标签: symfony phpunit


【解决方案1】:

也许尝试将控制器实例化为部分模拟。这将允许您“覆盖”某些功能,在这种情况下

  • createCreateForm
  • 重定向
  • getDoctrine
  • 生成网址

您可以覆盖这些方法并让它们返回模拟版本或您的测试控制的对象。在重定向的情况下,您可以给出方法期望。

$controller = $this->getMock( 'MyController', array( 'createCreateForm', 'redirect', 'getDoctrine', 'generateUrl' ) );

【讨论】:

  • 当我验证这个控制器方法时,它显示错误 $controller ->expects($this->$this->any()) ->method('redirect') ; "方法预期调用1次,实际调用0次"
猜你喜欢
  • 2014-07-30
  • 2012-04-24
  • 1970-01-01
  • 2020-08-12
  • 2017-06-26
  • 2011-12-01
  • 2014-01-16
  • 1970-01-01
相关资源
最近更新 更多