Bonjour tout le monde;

je suis en train d'écrire différent teste sur mon application pour vérifier que tout fonctionne correctement.
Et, je suis arrivée sur une petite complication sur un ParamConverter.
Tout simplement, il y a un paramètre id dans mon URL et il est automatiquement converti en objet actualité.

Je suis tombé sur ce topic qui me semble répondre à ma question, mais il ne décrit pas comment faire et étant débutant dans le test unitaire, j'ai un peu de mal ^^

Voici mon test actuellement

 public function testShow()
    {
        $actuality = new Actuality();
        $actuality->setId(1);
        $actuality->setDescription("TEST");
        $actuality->setContent("CONTENT");
        $actuality->setTitle("Title");

        $actualityRepository = $this->createMock(ObjectRepository::class);

        $actualityRepository->expects($this->any())
            ->method('find')
            ->willReturn($actuality);

        $objectManager = $this->createMock(ObjectManager::class);

        $objectManager->expects($this->any())
            ->method('getRepository')
            ->willReturn($actualityRepository);

        $client = static::createClient();

        $url = $client->getContainer()->get("router")->generate("public_actuality_show.fr", ["id" => 1]);
        $client->request("GET", $url);
        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    }

Ma route

public_actuality_show:
    defaults: { _controller: PublicBundle:Actuality:show, slug: null }
    path: '/{id}-{slug}'
    requirements:
        id: '\d+'
        slug: '[a-zA-z0-9_-]*'

Mon action

/**
     * @Template()
     * @param Actuality $actuality
     * @return array
     */
    public function showAction(Actuality $actuality)
    {
        return ["actuality" => $actuality];
    }

Ce que je demande, c'est qu'on m'aide à terminé ce test :)

Aussi, je refuse pas des conseils ;)

Merci pour votre aide.

EDIT

En fouillant dans les codes de test unitaire de paramConverter, j'ai écrit un code qui ressemble à ça :

    public function testShow()
    {
        $actuality = new Actuality();
        $actuality->setId(1);
        $actuality->setDescription("TEST");
        $actuality->setContent("CONTENT");
        $actuality->setTitle("Title");

        $client = static::createClient();

        $converter = $this->createParamConverterMock();
        $converter
            ->expects($this->never())
            ->method('supports')
        ;

        $converter
            ->expects($this->never())
            ->method('apply')
        ;

        $request = new Request();
        $request->attributes->set('id', $actuality);

        $configuration = new ParamConverter(array(
            'name' => 'id',
            'class' => Actuality::class,
        ));

        $manager = new ParamConverterManager();
        $manager->add($converter);
        $manager->apply($request, array($configuration));

        $url = $client->getContainer()->get("router")->generate("public_actuality_show.fr", ["id" => 1]);
        $client->request("GET", $url);
        $this->assertEquals(200, $client->getResponse()->getStatusCode());
    }

    protected function createParamConverterMock()
    {
        return $this
            ->getMockBuilder('Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface')
            ->getMock();
    }

Mais comme je vous demande de l'aide, c'est que le code ne fonctionne pas ^^

1 réponse


remy76690
Auteur
Réponse acceptée

Salut tout le monde,

J'ai trouvé une solution à mon problème.
Je vais utiliser une base de données en mémoire et ensuite persister mes objets avec une transaction

   /**
     * Init
     */
    public function setUp()
    {
        $this->client = static::createClient();
        DatabaseMetadata::init($this->client->getKernel());
        $this->entityManager = $this->client->getContainer()->get("doctrine.orm.default_entity_manager");

        $this->entityManager->beginTransaction();
        $this->entityManager->getConnection()->setAutoCommit(false);
    }

    public function tearDown()
    {
        parent::tearDown();

        $this->entityManager->rollback();
        $this->entityManager->close();
        $this->entityManager = null;
    }

Et concernant la méthode finit de la classe DatabaseMetadata, je vous redirige vers cet article : https://www.sitepoint.com/quick-tip-testing-symfony-apps-with-a-disposable-database/