2012-01-25 23 views
6

Sto utilizzando phpunit per eseguire test funzionali ma sto riscontrando un problema con alcuni moduli. Il problema è che phpunit non è a conoscenza di JS e ho un modulo con una casella di selezione popolata dinamicamente che richiede jQuery.Symfony2 Test funzionale: passaggio diretto dei dati del modulo

Quindi ho bisogno di passare direttamente i dati del modulo. Il "libro" fornisce il seguente esempio:

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

Quando ho utilizzato questo esempio, il controller non ha ricevuto alcun dato del modulo. Inizialmente ho visto che passare la chiave dell'array 'nome' non era corretto nella mia situazione in quanto avevo bisogno del nome del modulo che era 'timesheet' nel mio codice. Così ho provato qualcosa del tipo:

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

Ma questo ancora non ha funzionato. Nel controllore ho cercato di capire cosa stava succedendo e che cosa se veniva ricevuto nulla:

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

questo non ha funzionato e $ progetto rimase vuota. Tuttavia se ho usato il seguente codice ho ottenuto il valore:

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

Ma chiaramente non è quello che voglio. Almeno se posso vedere che ci sono alcuni dati POST. Il mio ultimo tentativo è stato quello di provare il seguente nel metodo di prova:

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

Così sto cercando di passare una matrice 'scheda attività' come il primo elemento della matrice di parametri richiesta. Ma con questo ottengo l'errore:

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 

Sarei molto felice se qualcuno può espandersi su ciò che è nel 'libro' di come dovrei ottenere questo lavoro.

Modulo legano controller:

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

Il tuo ultimo tentativo guarda bene a me. Si prega di incollare parte del controller in cui si associa il modulo. Inoltre, avete letto il capitolo della documentazione sui test funzionali (http://symfony.com/doc/2.0/libro/testing.html # forme)? Potresti provare a manipolare l'elemento del modulo. –

+0

Ho aggiunto la parte relativa al controller adesso. Ho letto un paio di volte il capitolo del libro sui test funzionali cercando qualcosa che mi sia sfuggito. Quando suggerisci di manipolare l'elemento del modulo, intendi aggiungere i dati nel test funzionale al modulo? Questo non è possibile in quanto il modulo ha una selezione dinamica popolata usando AJAX. Quindi è vuoto e nulla può essere selezionato, quindi ho bisogno di inviare i contenuti del modulo al controller. – DanF7

risposta

0

Provare a usare $form->bind($clientData) invece di $form->bindRequest($request).

5

Se si vogliono sapere come iniettare matrici di dati POST utilizzando il client di prova ...

nel metodo di prova, fare qualcosa di simile

$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(...); 

Nel controllore, si dovrebbe accedere i tuoi params come questo:

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

Oppure si può semplicemente utilizzare l'API forme se il metodo di prova è stato iniettando dati valida forma ...

+0

Se questo risponde alla tua domanda, potresti contrassegnarlo come corretto? Se non è possibile aggiungere un commento che spieghi perché? Grazie! –

+0

lo provo e non ha funzionato. Non so perché. Quando provo direttamente usando il debug REST. Funziona: |. Sembrano bug Symfony WebTestCase: | – GusDeCooL

+0

stranamente, dopo ore di ricerca, questo è l'UNICO posto su Internet in grado di scoprire definitivamente che il 3 ° parametro è dove vanno i dati del post. Grazie per questo .. Se qualcuno è in grado di fornire un link migliore in cui si afferma che cosa è ogni parametro per poi im tutti gli orecchi. – blamb

2

hai un parametro $request nella tua azione? che era il motivo per cui il mio request->get() era vuoto:

//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 
} 

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

Problemi correlati