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 ^^
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/