Как обрабатывать маршрутизацию с помощью локали в Symfony 4.3 KernelTestCase? - PullRequest
1 голос
/ 05 марта 2020

Мне нужно протестировать (PHPUnit) сервис в приложении Symfony 4.3, и этот сервис зависит от фреймворка. Он использует Translator и Router, и это также зависит от пользователя. Это означает, что я хочу написать KernelTestCase с пользователем (готово). Проблема в том, что Маршрутизатор отказывает, потому что Маршруты нуждаются в _locale. Как мне решить проблему?

1) App\Tests\blahblah\MenuFactoryTest::testMenuItemsByRoles with data set "ROLE_ADMIN" (array('ROLE_ADMIN'), array(array('Menu Label 1', 'Menu Label 2')))
Symfony\Component\Routing\Exception\MissingMandatoryParametersException: Some mandatory parameters are missing ("_locale") to generate a URL for route "default_dashboard".

class MenuFactoryTest extends KernelTestCase
{
    use LogUserTrait; // my trait allowing to emulate a user with particular roles 

    /** @var MenuFactory */
    private $menuFactory;

    protected function setUp(): void
    {
        static::bootKernel();

        $this->menuFactory = static::$container->get(MenuFactory::class);

    }

    // ...

    /**
     * @param array $roles
     * @param array $menuLabels
     *
     * @dataProvider provideMenuItemsByRoles
     */
    public function testMenuItemsByRoles(array $roles, array $menuLabels): void
    {
        $this->logIn($roles);

        $this->assertMenuItemsHaveLabels(
            $menuLabels,
            $this->menuFactory->getMenuItems()
        );
    }

    // ...
}

class MenuFactory implements MenuFactoryInterface
{
    /** @var RouterInterface */
    private $router;

    /** @var AuthorizationCheckerInterface */
    private $securityChecker;

    /** @var TranslatorInterface */
    private $translator;

    public function __construct(
        RouterInterface $router,
        AuthorizationCheckerInterface $securityChecker,
        TranslatorInterface $translator
    ) {
        $this->router = $router;
        $this->securityChecker = $securityChecker;
        $this->translator = $translator;
    }

    public function getMenuItems(string $appMenuName = null): array
    {
        $menuItems = [];

        $dashboardMenu = new DefaultMenuItem(
            $this->translator->trans('menu.dashboard'),
            $this->router->generate('default_dashboard'),
            'fa fa-dashboard'
        );

        $menuItems[] = $dashboardMenu;

        // ...

        return $menuItems;
    }
}

...