2016-09-05 3 views
7

Я только начинаю использовать PHPUnit с Zend и не нуждаюсь в помощи, чтобы понять, как эти тесты должны работать.Zend 2: Модульные тесты для класса формы

Я хочу проверить, если форма возвращает какое-либо сообщение об ошибке, если я не передаю никаких параметров POST.

Проблема заключается в том, что одно поле из моей формы с помощью DoctrineModule\Form\Element\ObjectSelect

... 
    $this->add(array(
     'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 
    ... 

Я получаю следующее сообщение об ошибке Doctrine в:
Fatal error: Call to a member function getIdentifierFieldNames() on null

Я попытался переопределить это поле издевались объекта, однако Zend Безразлично» t позволяют objects в type, просто класс имя (string), поэтому этот код не работает:

public function testIfFormIsValid() 
{ 
    $objectSelect = $this->getMockBuilder('DoctrineModule\Form\Element\ObjectSelect') 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $objectSelect->expects($this->any()) 
     ->method('getValueOptions') 
     ->will($this->returnValue(array())); 

    $form = new \AppModuleComment\Form\Comment('form', array(
     'em' => $this->em // Mocked object 
    )); 
    $form->add(array(
     'type' => $objectSelect, 
     'name' => 'user', 
     'attributes' => array(
      'id' => 'user-label', 
     ), 
     'options' => array(
      'object_manager' => $this->em, 
      'target_class' => 'Application\Entity\User', 
      'property' => 'username', 
      'label' => 'User:', 
      'display_empty_item' => true, 
      'empty_item_label' => '---', 
      'label_generator' => function($entity) { 
       return $entity->getUsername(); 
      }, 
     ), 
    )); 

    $data = array(
     'id' => null, 
     'user' => null 
    ); 

    $form->setData($data); 
    $this->assertTrue($form->isValid(), 'Form is not valid'); 
}  

Что я делаю неправильно? Как проверить такой код?

ответ

1

Кажется, вы тестируете функциональность Zend или Doctrine (или обоих), а не свой собственный код. Когда вы используете библиотеки, вы должны доверять этим библиотекам.

Что происходит: Form\Form::add() использует Form\Factory::create() для создания из массива элемента. Form\Factory::create() использует Form\FormElementManager::get() для получения элемента из заданного типа.

Ваш тип объекта и потому, что Form\FormElementManager::get() не может обрабатывать объекты, с которыми не работает ваш скрипт.

Кажется, что вы хотите проверить, что если почта пуста Form::valid() вызывает ObjectSelect::valid(), но это не проверяет, является ли значение нулевым. Это код от Doctrine/Zend, а не ваш. Не проверяйте его.

Более интересно, когда вы хотите высмеять результат выбора из Doctrines ObjectSelect. Но это еще один вопрос.

+0

Итак, как я должен проверить Если форма возвращает сообщения проверки, если кто-то представляет пустую форму? Или, если форма действительна, если пользователь предоставляет правильные данные? Мне нужна функциональность Doctrine для тестирования этого – user1409508

+1

Кажется, вам нужно больше практики для написания модульных тестов. Прежде всего: вы не пишете код внутри вашего модульного теста - вместо этого вы запускаете свой код. Я предлагаю играть с более легкими единицами, прежде чем пытаться тестировать контроллеры, генерирующие формы, которые используют сущности-менеджеры. Вы должны быть уверены, что вы хотите проверить на своем устройстве, и если вы хотите использовать двойные тесты или иметь фиксированный набор данных и так далее. – iRaS

+0

Возможно, вы правы, мне нужно больше практики для написания тестов. Но вы не объяснили, как я должен тестировать формы и inputFilters, связанные с Doctrine. Я хочу проверить, получаю ли сообщения проверки, когда пользователь посылает пустую форму, или пропускает некоторые входы. Причина, по которой я написал код в моих тестах, заключается в том, что я хотел показать, что я пытался заставить его работать с Doctrine – user1409508

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