2012-01-25 16 views
6

Używam phpunit do uruchamiania testów funkcjonalnych, ale mam problem z kilkoma formularzami. Problem polega na tym, że phpunit nie jest świadomy JS i mam formularz z dynamicznie wypełnionym polem wyboru, które wymaga jQuery.Symfony2 Test funkcjonalny: przekazywanie danych z formularza bezpośrednio

Muszę więc przekazać dane formularza bezpośrednio. The „książka” podaje następujący przykład:

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

Kiedy użyłem tego przykładu sterownik nie otrzymała żadnych danych formularza. Intially widziałem, że przekazanie klucza tablicy "name" nie było poprawne w mojej sytuacji, ponieważ potrzebowałem nazwy formularza, która była "timesheet" w moim kodzie. Więc spróbowałem czegoś takiego:

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

Ale to wciąż nie zadziałało. W regulatorze Starałem się zrozumieć, co się dzieje i co zrobić, jeśli coś było odbierane:

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

to nie działa i $ projekt pozostał pusty. Jednak jeśli użyłem następujący kod mam wartość:

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

jednak wyraźnie, że nie jest to, co chcę. Najmniejszy chociaż widzę, że istnieje kilka danych POST. Moja ostatnia próba była spróbuj wykonać następujące czynności w metodzie badania:

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

Więc staram się przekazać „grafik” tablicę jako pierwszy element tablicy żądanie parametru. Ale z tym pojawia się błąd:

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 

Byłbym bardzo szczęśliwy, jeśli ktoś może rozwinąć, co jest w książce „” O, jak ja powinien dostać tej pracy.

Forma wiążą kontroler:

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

Twoja ostatnia próba wygląda dobrze do mnie. Wklej część kontrolera w miejscu powiązania formularza. Czy przeczytałeś także rozdział dotyczący dokumentacji testów funkcjonalnych (http://symfony.com/doc/2.0/book/testing.html # forms)? Możesz spróbować manipulować elementem formularza. –

+0

Dodałem teraz odpowiednią część kontrolera. Przeczytałem ten rozdział książki dotyczący testowania funkcjonalnego kilka razy, szukając teraz czegoś, co mogłem przegapić. Kiedy sugerujesz manipulowanie elementem formularza, czy chcesz dodać dane do testu funkcjonalnego do formularza? Nie jest to możliwe, ponieważ formularz ma dynamiczny wybór, który jest wypełniany za pomocą AJAX. Więc jest pusty i nic nie można wybrać, dlatego muszę POST treść formularza do kontrolera. – DanF7

Odpowiedz

0

spróbować użyć $form->bind($clientData) zamiast $form->bindRequest($request).

5

Jeśli chcą wiedzieć, jak wstrzykiwać tablice danych POST przy użyciu klienta testowego ...

W swojej metodzie badania, zrobić coś podobnego

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

w sterowniku, by uzyskać dostęp do twoje params jak ten:

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

Albo można po prostu skorzystać z formularzy API czy metoda test wstrzykiwanie ważne dane formularza ...

+0

Jeśli to odpowie na twoje pytanie, możesz oznaczyć je jako prawidłowe? Jeśli nie, możesz dodać komentarz wyjaśniający dlaczego? Dzięki! –

+0

testowałem i to nie działało. Nie wiem dlaczego. Kiedy testuję bezpośrednio przy użyciu debugowania REST. Działa: |. Wygląda na to, że robią błędy w Symfony WebTestCase: | – GusDeCooL

+0

co dziwne, po godzinach poszukiwań jest to TYLKO Miejsce w Internecie, w którym można dowiedzieć się ostatecznie, że trzeci parametr dotyczy danych pocztowych. Dziękuję za to .. Jeśli ktoś może zapewnić lepszy link, w którym określa, do czego służy każdy parametr, to wszystkie uszy. – blamb

2

Czy masz w swoim działaniu parametr $request? to był powód dlaczego mój request->get() była pusta:

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

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

Powiązane problemy