Accueil » Développement » Symfony » Symfony – Crée une commande simple et le tester
Symfony Logo

Symfony – Crée une commande simple et le tester

Symfony a dans ses composants de base, une console qui permet de lancer des commandes avec bin/console (app/console pour Symfony 2.X). Dans cette article, je vais créer une commande avec des tests unitaires.

Pour créer une commande custom, il faut créer un dossier Command à la racine du projet (Sinon vous pouvez toujours le faire via le makerBundle si vous aimez générer le code).

Pour l’exemple, je vais créer une commande qui va créer un utilisateur avec des contraintes.

//src/Command/CreateUserCommand.php

namespace App\Command;

use App\Entity\User;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class CreateUserCommand extends Command
{
    protected static $defaultName = 'app:create-user';

    private $manager;

    public function __construct(ObjectManager $manager)
    {
        $this->manager = $manager;

        parent::__construct();
    }

    protected function configure()
    {
        $this
            ->setDescription('Command for create user')
            ->addArgument('firstName', InputArgument::REQUIRED, 'User firstname')
            ->addArgument('lastName', InputArgument::OPTIONAL, 'User lastname optional')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln([
            'Command Create User',
            '============'
        ]);

        $user = new User();

        $user->setFirstName($input->getArgument("firstName"));
        $output->writeln("With firstname : ". $user->getFirstName());

        $lastName = $input->getArgument("lastName");

        if (!$lastName) {
            $user->setLastName("DOE");
            $output->writeln("User doesn't have a lastname");
        } else {
            $user->setLastName($lastName);
            $output->writeln("With lastname : ". $user->getLastName());
        }

        $this->manager->persist($user);
        $this->manager->flush();
        $output->writeln('Successful you have created the user : '. $user->getFirstName() . " ". $user->getLastName());
    }
}

Cette commande permet de créer un utilisateur avec un firstname obligatoire et un lastname optionnel. Avec une insertion à la base de données avec l’objectManager (Un article sera dédié à l’injection de dépendances).

Désormais que la commande est faite, je vais l’ajouter à nos tests unitaires.

//tests/Command/CreateUserCommandTest

namespace App\Tests\Command;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Console\Tester\CommandTester;

class CreateUserCommandTest extends KernelTestCase
{

    public function testExecute()
    {
        $kernel = static::createKernel();
        $application = new Application($kernel);

        $command = $application->find('app:create-user');
        $commandTester = new CommandTester($command);
        $commandTester->execute([
            'command'  => $command->getName(),

            'firstName' => 'Gary',
            'lastName' => 'Houbre',
        ]);

        // the output of the command in the console
        $output = $commandTester->getDisplay();
        $this->assertContains('Successful you have created the user : Gary Houbre', $output);
    }
}

Conclusion, dans cet article, j’ai créé une commande sur Symfony avec un test unitaire qui permet de vérifier sa stabilité.

Si vous voulez soutenir le blog, n’hésitez pas à me faire une donation, merci