Функциональный тест Symfony2: передача данных формы напрямую - PullRequest
6 голосов
/ 25 января 2012

Я использую phpunit для запуска функциональных тестов, но у меня проблема с несколькими формами.Проблема в том, что phpunit не знает о JS, и у меня есть форма с динамически заполненным полем выбора, которая требует jQuery.

Так что мне нужно передать данные формы напрямую.«Книга» дает следующий пример:

// 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 остался пустым.Однако, если бы я использовал следующий код, я получил бы значение:

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

Но, очевидно, это не то, что я хочу.По крайней мере, я вижу, что есть некоторые данные POST.Моя последняя попытка состояла в том, чтобы попробовать следующее в методе теста:

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

Поэтому я пытаюсь передать массив «расписания» в качестве первого элемента массива параметров запроса.Но с этим я получаю сообщение об ошибке:

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

Ответы [ 3 ]

5 голосов
/ 28 января 2013

Если вы хотите узнать, как внедрить массивы данных POST с помощью тестового клиента ...

В вашем тестовом методе сделайте что-то вроде

$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'];

Или вы могли бы просто использовать API форм, если тестовый метод вводил правильные данные формы ...

2 голосов
/ 24 июля 2014

у вас есть параметр $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
}

см Как создать функциональный тест, который включает POST для страницы с параметрами?

0 голосов
/ 08 апреля 2012

Попробуйте использовать $form->bind($clientData) вместо $form->bindRequest($request).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...