2016-09-05 8 views
7

के लिए यूनिट परीक्षण मैं केवल ज़ेंड के साथ PHPUnit का उपयोग शुरू कर रहा हूं और यह पता लगाने में थोड़ा मदद चाहिए कि इन परीक्षणों को कैसे काम करना चाहिए।ज़ेंड 2: फॉर्म क्लास

मैं परीक्षण करना चाहता हूं कि अगर कोई पोस्ट पैरामीटर पास नहीं करता है तो फॉर्म कोई त्रुटि संदेश लौटाता है या नहीं।

समस्या यह है कि मेरी फार्म से एक क्षेत्र सिद्धांत के 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(); 
      }, 
     ), 
    )); 
    ... 

मैं निम्नलिखित मिल त्रुटि उपयोग कर रहा है:
Fatal error: Call to a member function getIdentifierFieldNames() on null

मेरी नक़ल वस्तु के साथ इस क्षेत्र को ओवरराइड करने की कोशिश की, फिर भी Zend नहीं करता ' 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

ऐसा लगता है कि आप ज़ेंड या सिद्धांत (या दोनों) की कार्यक्षमता का परीक्षण कर रहे हैं, न कि अपना कोड। जब आप पुस्तकालयों का उपयोग करते हैं तो आपको इन पुस्तकालयों पर भरोसा करना चाहिए।

क्या होता है: Form\Form::add() किसी तत्व से सरणी बनाने के लिए Form\Factory::create() का उपयोग करता है। दिए गए प्रकार से तत्व प्राप्त करने के लिए Form\Factory::create()Form\FormElementManager::get() का उपयोग करता है।

आपका प्रकार एक ऑब्जेक्ट है और Form\FormElementManager::get() आपकी स्क्रिप्ट विफल होने वाली ऑब्जेक्ट्स को संभाल नहीं सकता है।

ऐसा लगता है कि आप परीक्षण करना चाहते हैं कि अगर पोस्ट खाली है Form::valid()ObjectSelect::valid() पर कॉल करता है लेकिन यह सत्यापित नहीं करता है कि मान शून्य है या नहीं। वह सिद्धांत/ज़ेंड से आपका कोड नहीं है। इसका परीक्षण न करें।

जब आप डॉक्टरों ObjectSelect के भीतर से किसी चयन के परिणाम का नकल करना चाहते हैं तो यह अधिक दिलचस्प होता है। लेकिन यह एक और सवाल है।

+0

तो .. मुझे कैसे परीक्षण करना चाहिए यदि फॉर्म खाली फॉर्म जमा करता है तो फॉर्म सत्यापन सत्यापन देता है? या यदि उपयोगकर्ता सही डेटा प्रदान करता है तो फॉर्म मान्य है? मुझे इस – user1409508

+1

का परीक्षण करने के लिए डॉक्टर की कार्यक्षमता की आवश्यकता है ऐसा लगता है कि आपको इकाई परीक्षण लिखने के लिए और अधिक अभ्यास की आवश्यकता है। सबसे पहले: आप अपने यूनिट टेस्ट के अंदर कोड नहीं लिखते - इसके बजाय आप अपना कोड चलाते हैं। मैं नियंत्रकों का परीक्षण करने से पहले आसान इकाइयों के साथ खेलना चाहता हूं जो इकाई प्रबंधकों का उपयोग करने वाले रूपों को उत्पन्न करते हैं। आपको यह सुनिश्चित करना चाहिए कि आपकी इकाई क्या है जिसे आप परीक्षण करना चाहते हैं और यदि आप परीक्षण युगल का उपयोग करना चाहते हैं या एक निश्चित डेटासेट और अन्य हैं। – iRaS

+0

शायद आप सही हैं मुझे परीक्षण लिखने के लिए और अधिक अभ्यास की आवश्यकता है। लेकिन आपने यह नहीं समझाया कि मैं सिद्धांतों और इनपुट का परीक्षण कैसे कर सकता हूं सिद्धांतों से जुड़े फ़िल्टर। मैं परीक्षण करना चाहता हूं कि जब उपयोगकर्ता खाली फॉर्म भेजता है या वह कुछ इनपुट छोड़ देता है तो मुझे सत्यापन संदेश प्राप्त होंगे। मेरे परीक्षणों में कोड लिखने का कारण यह है कि मैं यह दिखाना चाहता था कि मैंने इसे सिद्धांत के साथ काम करने के लिए क्या करने की कोशिश की – user1409508

संबंधित मुद्दे