Tester sa route avec un ParamConverter

Par remy76690, il y a 8 ans


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, il y a 8 ans

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/