Я использую встроенные контроллеры для создания динамического содержимого в боковых шаблонах (например: меню)Как протестировать встроенный контроллер symfony2 с phpunit?
Обычно я реализую функциональные тесты для утверждения контроллеров. До сих пор проходят функциональные тесты, и phpunit считает, что мои встроенные контроллеры покрыты кодом
Мне интересно, как протестировать встроенный контроллер с различными входами и оценить выходы ... Правильно ли это тестирование устройства?
Я знаю, что контроллер тестирования модулей - это плохая практика, но как я могу проверить встроенный контроллер, если нет объекта запроса? Маршрут/URL-адрес - это то, что заботится о функции Twig render().
{{ render(controller('AppSuperBundle:Default:generateMenu', {'params': ... })) }}
Пример для иллюстрации:
class DefaultController extends Controller
{
public function testAction()
{
return $this->render('AppSuperBundle::index.html.twig');
}
public function generateMenuAction($route, Array $RouteParams)
{
$repo = $this->getDoctrine()->getRepository(...
//some process to generate params of menu items (eg:locale, url, name...)
return $this->render('AppSuperBundle::menu.html.twig', array('menuItems' => $menuItemsWithParams));
}
}
Шаблон index.html.twig
<html>
<body>
{% block menu %}
{{ render(controller('AppSuperBundle:Default:generateMenu', {'route': app.request.attributes.get('_route'), 'RouteParams': app.request.attributes.get('_route_params')})) }}
{% endblock %}
{% block content %}
...
{% endblock %}
</body>
</html>
Что вы думаете по этому поводу?
Я думаю, в целом вы не должны пытаться встроить выходные данные контроллеров таким образом. Вы проверили https://github.com/KnpLabs/KnpMenuBundle? – nateevans
Спасибо за ваш комментарий. Я использую doctrine, translatable, sluggable и tree для создания моих гиперссылок i18n. Насколько мне известно, KnpMenuBundle использует только файлы переводов. Мой код ясен и работает только с одной функцией контроллера и шаблоном, поэтому я не вижу необходимости внедрять сервис и настраивать его. Каким образом внедряются встроенные контроллеры? – x0s
В моем обучении с Райаном Уивером, основным членом Symfony и главным автором документации, он вообще обескуражил меня использовать контроллеры нестандартными способами в качестве условного соглашения. Но я пытался делать такие вещи, как вызов контроллера изнутри другого Контроллера. Бад-Джуджу. Вернемся к исходному вопросу, я думаю, вы можете проверить маршрут, на котором находится встроенный контроллер. См. Http://symfony.com/doc/current/book/testing.html#your-first-functional-test. Вы можете передавать разные параметры и использовать искатель для поиска ожидаемого результата на основе вашего запроса – nateevans