2012-02-27 8 views
9

Viene visualizzato "InvalidArgumentException: l'elenco di nodi corrente è vuoto." eseguire test funzionali tramite PHPUnit. Ecco di prova ho scritto:Test funzionale Symfony2 InvalidArgumentException: l'elenco di nodi corrente è vuoto

public function testAdd() 
{ 
    $client = static::createClientWithAuthentication('main'); 

    $crawler = $client->request('GET', 'en/manage'); 

    $send_button = $crawler->selectButton('submit'); 

    $form = $send_button->form(array(
     'PrCompany[email]' => '[email protected]', 
     'PrCompany[first_name]' => 'Anton', 
     'PrCompany[last_name]' => 'Tverdiuh', 
     'PrCompany[timezone]' => 'Europe/Amsterdam' 
    )); 

    $form['PrCompany[companies][1]']->tick(); 

    $client->submit($form); 


    $this->assertTrue($crawler->filter('html:contains("User is invited")')->count() > 0); 

} 
+0

Penso di avere una domanda simile che potrebbe aiutarti a capire di più il tuo problema. Nessuna risposta ancora ... http://stackoverflow.com/questions/9662697/symfony2-functional-testing-crawler-not-working – Matt

+0

Non hai indicato alcuna domanda come risposta, quindi aggiungerò il mio, si spera risolvendo domanda –

+0

Penso che sia necessario usare '$ form ['PrCompany [companies]'] [1] -> tick(); '(con [1] al di fuori delle virgolette) – caponica

risposta

11

È possibile eseguire il debug del problema utilizzando var_dump($client->getResponse()->getContent());

Inoltre, penso che si dovrebbe scrivere questo:

$crawler = $client->submit($form); 

altrimenti sarete testare la risposta dei il primo URL, prima della presentazione della forma.

0

È possibile provare a utilizzare Codeception con il modulo Symfony2. Fornisce un'interfaccia flessibile per i test funzionali Symfony2 e ha migliori funzionalità di debug.

2

Come un follow-up a quello che ha scritto @ greg0ire, controllare per vedere se

var_dump($client->getResponse()->getContent()); 

restituisce una pagina di reindirizzamento anziché il contenuto effettivo. Se è così, è possibile aggiungere questo:

$client->followRedirects(true); 
5

ero anche alle prese con questo, e sembrava che il metodo selectButton attivato questo errore.

Dopo aver letto su DOM Crawler docs ho scoperto che il metodo selectButton accetta il testo del pulsante effettivo come argomento stringa. Quindi se il tuo pulsante è "invia il mio modulo per favore", questo sarà il tuo testo.

Ci vuole diversi parametri troppo, come mostrato di seguito (presi dalla documentazione)

A selectButton() method is available on the Crawler which returns another 
Crawler that matches a button (input[type=submit], input[type=image], 
or a button) with the given text. 

EDIT

Dopo aver finalmente completato con successo il test vorrei anche consiglia di seguire questo esempio per i test forme:

use Goutte\Client; 

$client = new Client(); 
$crawler = $client->request('GET', 'https://github.com/login'); 

$form = $crawler->selectButton('Log in')->form(); 
$form['login'] = 'symfonyfan'; 
$form['password'] = 'anypass'; 

$crawler = $client->submit($form); 
$this->assertTrue($crawler->filter('html:contains("Welcome Back")')->count() > 0); 

La differenza principale è, ho utilizzato t egli Goutte fascio, che ho installato con il compositore da the packagist (nel mio caso ho aggiunto "fabpot/goutte": "1.0.*@dev")

+0

Penso che l'idea di utilizzare il test integrato non abbia bisogno di librerie aggiuntive. L'introduzione di Goutte sembra essere eccessivo quando puoi farlo con gli strumenti integrati – skoop

+0

@Andrew Atkinson è Goutte necessario per testare i moduli? Ricevo sempre un errore 'campo non raggiungibile', quando seguo le esercitazioni standard – Aris

+0

@skoop Nel mio caso sto usando Goutte e funziona perfettamente. –

0

Questo errore si verifica quando crawler non riesce a trovare elemento di modulo richiesto; Piuttosto difficile quando si sta utilizzando, per esempio, sotto forma builder come quando viene eseguito, si creerà diverso nome dell'ingresso:

$form = $this-> createFormBuilder($store) 
      ->add('storeNumber','text') 
      ->add('storeName','text') 
      ->add('save', 'submit') 
      ->getForm(); 

volontà nome campo di emissione come:

form_storeNumber 

che dovrebbe essere utilizzato in classe di test :

$form=$crawler->selectButton('save')->form(); 
$form['form_storeNumber']='10'; 
1

Vedo che la domanda non ha ancora risposta. Ho avuto lo stesso problema.

Nel mio caso goutte non è stato in grado di fare questa richiesta perché il nome di input è cambiato da javascript al volo.

Quando goutte ha ricevuto il codice HTML, ha visto un modulo. E quando si inoltra con parametri pre-compilati, gli elementi di input del modulo non possono essere confrontati con $form->setValues($params) quindi è stata generata l'eccezione \ InvalidArgumentException.

Risolto facendo richiesta a mano.

// $form->setValues($data); 
// $this->getGoutte()->submit($form); 

$data = array(
    'input_name[key]' => 'value' 
); 
$this->getGoutte()->request($form->getMethod(), $form->getUri(), $params); 
0

Ho avuto lo stesso problema con l'applicazione Silex. Ero alla ricerca di

$buttonCrawler = $crawler->selectButton('input[type="submit"]'); 

invece, il modo corretto per farlo è dare il valore del pulsante

$buttonCrawler = $crawler->selectButton('value_of_the_button'); 


Per esempio , nella tua pagina:

<form> 
    ... 
    <input type="submit" value="Click Me"> 
</form> 


E nelle vostre prove:

$buttonCrawler = $crawler->selectButton('Click Me'); 
$form = $buttonCrawler->form(); 
...