2012-01-25 15 views
6

मैं कार्यात्मक परीक्षण चलाने के लिए phpunit का उपयोग कर रहा हूं लेकिन मुझे कुछ रूपों में समस्या है। समस्या यह है कि phpunit जेएस के बारे में पता नहीं है, और मेरे पास एक गतिशील रूप से आबादी वाला चयन बॉक्स है जिसमें jQuery की आवश्यकता है।Symfony2 कार्यात्मक परीक्षण: सीधे फॉर्म डेटा पास करना

तो मुझे सीधे फॉर्म डेटा पास करने की आवश्यकता है।

// Directly submit a form (but using the Crawler is easier!) 
$client->request('POST', '/submit', array('name' => 'Fabien')); 

जब मैं इस उदाहरण का इस्तेमाल किया नियंत्रक प्रपत्र डेटा के किसी भी प्राप्त नहीं किया था: 'किताब' निम्न उदाहरण देता है। जानबूझकर मैंने देखा कि सरणी कुंजी 'नाम' को पार करना मेरी स्थिति में सही नहीं था क्योंकि मुझे फॉर्म कोड की आवश्यकता थी जो मेरे कोड में 'टाइम्सशीट' थी। तो मैंने कुछ ऐसा करने की कोशिश की:

$client->request('POST', '/timesheet/create', array('timesheet[project]' => '100')); 

लेकिन यह अभी भी काम नहीं करता है।

$postData = $request->request->get('timesheet'); 
$project = $postData['project']; 

यह काम नहीं किया और $ परियोजना खाली रह गए: नियंत्रक में मैं समझने के लिए क्या हो रहा था और क्या हुआ अगर कुछ भी प्राप्त किया जा रहा था की कोशिश की। लेकिन अगर मैं निम्नलिखित कोड का इस्तेमाल किया मैं मूल्य मिल गया:

$project = $request->request->get('timesheet[project]'); 

लेकिन स्पष्ट रूप से है कि नहीं है कि मैं क्या चाहता हूँ। कम से कम हालांकि मैं देख सकता हूं कि कुछ पोस्ट डेटा है। मेरे अंतिम प्रयास परीक्षा पद्धति में निम्नलिखित कोशिश करने के लिए किया गया था:

$this->crawler = $this->client->request('POST', '/timesheet/create/', array('timesheet' => array(project => '100')); 

इसलिए मैं अनुरोध पैरामीटर सरणी के पहले तत्व के रूप में एक 'timesheet' सरणी पारित करने के लिए कोशिश कर रहा हूँ। लेकिन इस के साथ मैं त्रुटि मिलती है:

Symfony\Component\Form\Exception\UnexpectedTypeException: Expected argument of type "array", "string" given (uncaught exception) at /mnt/hgfs/pmt/src/vendor/symfony/src/Symfony/Component/Form/Form.php line 489 

मैं बहुत खुश अगर किसी को क्या कैसे मैं इस काम करके करना चाहिए के बारे में 'किताब' में है पर विस्तार कर सकते हैं होगा। नियंत्रक में

फार्म बाँध:

if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      $postData = $request->request->get('timesheet'); 
      $project = $postData['project'];        

      $timesheetmanager = $this->get('wlp_pmt.timesheet_db_access'); 
      $timesheetmanager->editTimesheet($timesheet);            
      return $this->redirect($this->generateUrl('timesheet_list')); 
     } 
    } 
+0

आपकी आखिरी कोशिश मेरे लिए ठीक लग रहा है देखते हैं। कृपया अपने नियंत्रक का हिस्सा पेस्ट करें जहां आप फॉर्म को बांधते हैं। इसके अलावा, क्या आपने कार्यात्मक परीक्षण (http://symfony.com/doc/2) पर प्रलेखन अध्याय पढ़ा था।0/पुस्तक/testing.html # रूपों)? आप फॉर्म तत्व में हेरफेर करने का प्रयास कर सकते हैं। –

+0

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

उत्तर

0

कोशिश $form->bind($clientData) बजाय $form->bindRequest($request) उपयोग करने के लिए।

5

आप को पता है कि कैसे परीक्षण ग्राहक का उपयोग कर पोस्ट डेटा की सरणियों इंजेक्षन के लिए इच्छुक रहे हैं, तो ...

अपने परीक्षण विधि में, जैसे

$crawler = $client->request('POST', '/foo', array(
    'animal_sounds' => array(
     'cow' => 'moo', 
     'duck' => 'quack' 
    ) 
); // This would encode to '/foo?animal_sounds%5Bcow%5D=moo&animal_sounds%5Bduck%5D=quack' 

$this->assertTrue(...); 

नियंत्रक में कुछ करना है, तो आप का उपयोग होगा इस तरह से अपनी पैरामीटर:

$data = $request->request->get('animal_sounds'); 
$cowNoise = $data['cow']; 
$duckNoise = $data['duck']; 

या फिर आप अगर परीक्षा पद्धति वैध प्रपत्र डेटा इंजेक्शन लगाने गया था रूपों एपीआई का उपयोग कर सकता है ...

+0

यदि यह आपके प्रश्न का उत्तर देता है तो क्या आप इसे सही के रूप में चिह्नित कर सकते हैं? यदि यह कोई टिप्पणी नहीं दे सकता है तो क्यों? धन्यवाद! –

+0

मैं इसका परीक्षण करता हूं, और यह काम नहीं करता है। मुझे नहीं पता क्यों। जब मैं सीधे आरईएसटी डीबग का उपयोग कर परीक्षण करता हूं। यह काम करता है: | सिम्फनी वेबटेस्टकेस बग की तरह लगता है: | – GusDeCooL

+0

खोज के घंटों के बाद विचित्र रूप से पर्याप्त है, यह इंटरनेट पर केवल एक ही जगह है, यह निश्चित रूप से पता लगा सकता है कि तीसरा पैरामीटर है जहां पोस्ट डेटा जाता है। इसके लिए धन्यवाद .. अगर कोई बेहतर लिंक प्रदान कर सकता है जहां यह बताता है कि प्रत्येक परम क्या है तो सभी कान हैं। – blamb

2

क्या आपके पास अपनी कार्रवाई में $request पैरामीटर है? कि कारण है कि मेरी request->get() खाली था था:

//WRONG 
public function projectAction() 
{ 
    $request = Request::createFromGlobals(); 
    $project = $request->request->get('timesheet[project]'); 
    //$project will be empty 
} 


//CORRECT 
public function projectAction(Request $request) 
{ 
    $project = $request->request->get('timesheet[project]'); 
    //$project is not empty 
} 

How do I create a functional test which includes a POST to a page with parameters?

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