1

Я использую встроенные контроллеры для создания динамического содержимого в боковых шаблонах (например: меню)Как протестировать встроенный контроллер 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> 

Что вы думаете по этому поводу?

+0

Я думаю, в целом вы не должны пытаться встроить выходные данные контроллеров таким образом. Вы проверили https://github.com/KnpLabs/KnpMenuBundle? – nateevans

+0

Спасибо за ваш комментарий. Я использую doctrine, translatable, sluggable и tree для создания моих гиперссылок i18n. Насколько мне известно, KnpMenuBundle использует только файлы переводов. Мой код ясен и работает только с одной функцией контроллера и шаблоном, поэтому я не вижу необходимости внедрять сервис и настраивать его. Каким образом внедряются встроенные контроллеры? – x0s

+0

В моем обучении с Райаном Уивером, основным членом Symfony и главным автором документации, он вообще обескуражил меня использовать контроллеры нестандартными способами в качестве условного соглашения. Но я пытался делать такие вещи, как вызов контроллера изнутри другого Контроллера. Бад-Джуджу. Вернемся к исходному вопросу, я думаю, вы можете проверить маршрут, на котором находится встроенный контроллер. См. Http://symfony.com/doc/current/book/testing.html#your-first-functional-test. Вы можете передавать разные параметры и использовать искатель для поиска ожидаемого результата на основе вашего запроса – nateevans

ответ

0

Ваши встроенные контроллеры не существуют в вакууме. Они загружаются шаблонами, используемыми в ваших основных контроллерах.

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

0

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

public function testIndexAction() 
{ 
    $this->employeeRepository->expects($this->once())->method('findByFilter')->will($this->returnValue($this->employee)); 
    $this->entityManager->expects($this->once())->method('getRepository')->will(
     $this->returnValue($this->employeeRepository) 
    ); 


    $this->employeeManager->expects($this->once())->method('formatEmployeeData')->will(
     $this->returnValue($this->formattedJson) 
    ); 


    $this->mockContainer($this->object); 

    $this->object->indexAction(); 

}