Symfony2 Functional test: Passing form data directly

谁都会走 提交于 2020-01-02 03:23:28

问题


I am using phpunit to run functional tests but I am having a problem with a few of the forms. The problem is that phpunit is not aware of JS, and I have a form with a dynamically populated select box that needs jQuery.

So I need to pass the form data directly. The 'book' gives the following example:

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

When I used this example the controller didn't receive any of the form data. Intially I saw that passing the array key 'name' wasn't correct in my situation as I needed the form name which was 'timesheet' in my code. So I tried something like:

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

But this still didn't work. In the controller I tried to understand what was happening and what if anything was being received:

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

This didn't work and $project remained empty. However if I used the following code I got the value:

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

But clearly that's not what I want. Atleast though I can see that there is some POST data. My last attempt was to try the following in the test method:

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

So I am trying to pass a 'timesheet' array as the first element of the request parameter array. But with this I get the error:

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

I would be very happy if someone can expand on what's in the 'book' about how I am supposed to get this working.

Form bind in 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'));
        }
    }

回答1:


If you are wanting to know how to inject arrays of POST data using the test client...

In your test method, do something like

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

In the controller, you would access your params like this:

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

Or you could just use the forms API if the test method was injecting valid form data...




回答2:


do you have a $request parameter in your action? that was the reason why my request->get() was empty:

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

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




回答3:


Try to use $form->bind($clientData) instead of $form->bindRequest($request).



来源:https://stackoverflow.com/questions/9005350/symfony2-functional-test-passing-form-data-directly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!