2015-09-18 150 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次」 –