2015-09-18 105 views
0

我在单元测试用例新我有一个功能控制器单元测试的Symfony2

/** 
* 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

+0

也许只是单元测试您的验证而已。 – pazulx

+0

您是否在该文章的开头阅读了评论?单元测试控制器没有意义。尝试功能测试http://symfony.com/doc/current/book/testing.html#forms – Hpatoio

+0

恕我直言,我不相信单元测试控制器是不合适的。功能测试很重要,但对于测试整套边界条件来说它们不会很好,功能测试最适合测试一条“快乐”路径和一条“不快乐”路径,从而有效地测试层之间的'胶水'是否正常工作。现在控制器应该尽可能地瘦,所以不应该有太多的逻辑,但总是有一些,如问题所见。 有明显的赞成和对此,但一个空白的“不这样做”是没有那么有用,我认为。 – malte

回答

0

也许尝试实例化Controller作为部分模拟。这将允许你 '覆盖' 的某些功能,在这种情况下

  • createCreateForm
  • 重定向
  • getDoctrine
  • generateUrl

您可以重写这些方法,让他们返回嘲笑的版本或测试控制的对象。在重定向的情况下,您可以提供方法期望值。

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

+0

当我验证这种控制器的方法,它显示我错误 $控制器 - >期望($ this - > $ this->任何()) - >方法('重定向') ; “预计方法被称为1次,实际上称为0次” –