Как создать функциональный тест, который включает POST на страницу с параметрами? - PullRequest
0 голосов
/ 09 декабря 2011

Я прочитал документацию от Symfony2, но она не работает. Вот мой функциональный тест:

public function testSearch()
{
    $client = static::createClient();
    $crawler = $client->request('POST', '/search/results', array('term' => 'Carteron'));
    $this->assertTrue($crawler->filter('html:contains("Carteron")')->count() > 0);
    $this->assertTrue($crawler->filter('html:contains("Auctions")')->count() > 0);
}

В моем контроллере параметр "term" имеет значение null, когда приходит этот запрос. Однако, поиск работает очень хорошо, когда я выполняю его на сайте, поэтому я знаю, что проблема заключается в настройке теста.

Ответы [ 3 ]

1 голос
/ 24 июля 2014

У меня была такая же проблема, ни $request->query, ни $request->request не работали. Оба сделали то же самое для меня: он вернул $default, а не данный $parameters (Symfony 2.3).

То же поведение, что и у chris, в обычных веб-браузерах это работает. Я исправил это, заменив:

public function searchResultsAction($name)
{
    $request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

С:

public function searchResultsAction(Request $request, $name)
{
    // do NOT overwrite $request, we got it as parameter
    //$request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

То есть createFromGlobals() работает, только если установлены $_GET и $_POST. Shich не тот случай, если вы используете тестовый клиент Symfony. Вы должны добавить параметр $request к действию.

(я использовал $name в качестве параметра GET в моей маршрутизации)

0 голосов
/ 11 июня 2013

Я не знаю, ищет ли кто-нибудь ответ на этот вопрос, но в основном проблема в том, что вы ищете неправильное место для параметра.

Для вашего примера вам понадобится:

$term = trim($request->query->get('term'));

Надеюсь, это поможет!

0 голосов
/ 01 марта 2013

Я никогда не получал на это ответа, но реализовал обходной путь, который, кажется, работает для моих целей тестирования. Я хотел бы услышать отзывы или получить реальные ответы на эти вопросы.

Я создал второй маршрут для тестирования.

В реальном использовании URI будет /search/results?term=searchtermhere

В целях тестирования это не сработало. Я никогда не мог получить доступ к значению термина при вызове через автоматизированный тест. Итак, что я сделал, это создал 2-й маршрут только для тестирования, который имеет URI /search/results/{searchtermhere}.

Тогда мой класс действий, используемый для реального поиска, вызывал бы другую функцию и передавал бы термин функции:

public function searchResultsAction()
{
    $request = Request::createFromGlobals();
    $term = trim($request->request->get('term'));
    return $this->searchResultsWithTermAction($term);
}

Так что мои функциональные тесты будут иметь размер searchResultsWithTermAction(), поэтому единственное покрытие кода, которое мне не хватает в этом обходном пути, - это извлечение термина из запроса.

...