2015-09-18 4 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

IMHO Я не считаю, что контроллеры единичных тестов неуместны. Функциональные тесты важны, но они не будут столь же хороши для тестирования целого набора граничных условий, функциональный тест лучше всего подходит для тестирования одного «счастливого» пути и одного «несчастливого» пути, эффективно проверяя, что «клей» между слоями работает , Теперь верно, что контроллеры должны быть максимально тонкими, поэтому логики не должно быть слишком много, но всегда есть некоторые, как видно из вопроса. Очевидно, что для этого существуют аргументы и против, но упорный «не делай этого» не так полезен, я думаю. – malte

ответ

0

Возможно, попробуйте создать экземпляр Контроллера как частичный макет. Это позволит вам ставиться определенные функции, в данном случае

  • createCreateForm
  • перенаправлять
  • getDoctrine
  • generateUrl

Вы можете переопределение эти методы и получить их, чтобы вернуться издевательства версий или объектов, которые контролируют ваши тесты. В случае перенаправления вы можете дать ожидаемые методы.

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

+0

Когда я проверяю этот метод контроллера, он показывает мне ошибку $ controller -> ожидает ($ this -> $ this-> any()) -> метод ('redirect') ; «Метод должен был называться 1 раз, фактически называемый 0 раз» –

Смежные вопросы