= new Fibonacci(); $this->assertEquals(0, $fibonacci->fib(0)); $this->assertEquals(1, $fibonacci->fib(1)); } } Suite de Fibonacci RED 15 class FibonacciTest extends \PHPUnit_Framework_TestCase { public function testFibonacci() { $fibonacci = new Fibonacci(); $this->assertEquals(0, $fibonacci->fib(0)); $this->assertEquals(1, $fibonacci->fib(1)); } } duplication
public function testFibonacci($value, $result) { $fibonacci = new Fibonacci(); $this->assertEquals($result, $fibonacci->fib($value)); } public function getValues() { return array( array(0, 0), array(1, 1), ); } } Suite de Fibonacci REFACTOR 17
public function testFibonacci($value, $result) { $fibonacci = new Fibonacci(); $this->assertEquals($result, $fibonacci->fib($value)); } public function getValues() { return array( array(0, 0), array(1, 1), ); } } Suite de Fibonacci REFACTOR 17
public function testFibonacci($value, $result) { $fibonacci = new Fibonacci(); $this->assertEquals($result, $fibonacci->fib($value)); } public function getValues() { return array( array(0, 0), array(1, 1), ); } } Suite de Fibonacci REFACTOR 17
public function testFibonacci($value, $result) { $fibonacci = new Fibonacci(); $this->assertEquals($result, $fibonacci->fib($value)); } public function getValues() { return array( array(0, 0), array(1, 1), ); } } Suite de Fibonacci REFACTOR 17
for expert in experts %} <li>{{ expert }}</li> {% endfor %} </ul> {% endblock %} On fait en sorte que les experts soient dynamiques public function listAction() { $experts = array( 'Marek', 'Pierre-Henri', ); return array( 'experts' => $experts ); } REFACTOR Créer une nouvelle page 33
environment. * * @throws \Doctrine\DBAL\Schema\SchemaException */ protected static function generateSchema() { if (null === static::$kernel) { static::$kernel = static::createKernel(); } $em = static::$kernel->getContainer()->get('doctrine.orm.entity_manager'); // Get the metadata of the application to create the schema. $metadata = $em->getMetadataFactory()->getAllMetadata(); if (!empty($metadata)) { $tool = new \Doctrine\ORM\Tools\SchemaTool($em); $tool->dropDatabase(); $tool->createSchema($metadata); } else { throw new \Doctrine\DBAL\Schema\SchemaException( 'No Metadata Classes to process.' ); } } REFACTOR Créer une nouvelle page 39
= new \Nelmio\Alice\Loader\Base(); $objects = $loader->load($this->getExperts()); $persister = new \Nelmio\Alice\ORM\Doctrine( static::$kernel->getContainer()->get('doctrine.orm.entity_manager') ); $persister->persist($objects); // ... } Créer une nouvelle page
= new \Nelmio\Alice\Loader\Base(); $objects = $loader->load($this->getExperts()); $persister = new \Nelmio\Alice\ORM\Doctrine( static::$kernel->getContainer()->get('doctrine.orm.entity_manager') ); $persister->persist($objects); // ... } Créer une nouvelle page transforme les fixtures en objets
= new \Nelmio\Alice\Loader\Base(); $objects = $loader->load($this->getExperts()); $persister = new \Nelmio\Alice\ORM\Doctrine( static::$kernel->getContainer()->get('doctrine.orm.entity_manager') ); $persister->persist($objects); // ... } Créer une nouvelle page transforme les fixtures en objets persiste les objets dans la base
->findAll() ; $expert = new Expert(); $builder = $this->createFormBuilder($Expert); $form = $builder ->add('firstName') ->add('lastName') ->add('username') ->getForm(); ; if ($this->getRequest()->isMethod('post')) { $form->bind($this->getRequest()); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($form->getData()); $em->flush(); // ici on envoie un email, au nouvel expert // on créé ses comptes sur tous les services utilisés par la boite etc... return $this->redirect($this->generateUrl('theodoexpertbundle_expert_list')); } } return array('experts' => $experts, 'form’ => $form->createView()); } 47 Contrôleur
->findAll() ; $expert = new Expert(); $builder = $this->createFormBuilder($Expert); $form = $builder ->add('firstName') ->add('lastName') ->add('username') ->getForm(); ; if ($this->getRequest()->isMethod('post')) { $form->bind($this->getRequest()); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($form->getData()); $em->flush(); // ici on envoie un email, au nouvel expert // on créé ses comptes sur tous les services utilisés par la boite etc... return $this->redirect($this->generateUrl('theodoexpertbundle_expert_list')); } } return array('experts' => $experts, 'form’ => $form->createView()); } 47 Contrôleur création du formulaire
->findAll() ; $expert = new Expert(); $builder = $this->createFormBuilder($Expert); $form = $builder ->add('firstName') ->add('lastName') ->add('username') ->getForm(); ; if ($this->getRequest()->isMethod('post')) { $form->bind($this->getRequest()); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($form->getData()); $em->flush(); // ici on envoie un email, au nouvel expert // on créé ses comptes sur tous les services utilisés par la boite etc... return $this->redirect($this->generateUrl('theodoexpertbundle_expert_list')); } } return array('experts' => $experts, 'form’ => $form->createView()); } 47 Contrôleur création du formulaire sauvegarde l’expert
et du formulaire • la sauvegarde d’un nouvel expert test list Réutiliser l’existant 49 • la page d’édition • la sauvegarde de l’édition d’un expert new new
fixtures ... $crawler = $client->request('GET', '/experts'); $this->assertEquals(200, $client->getResponse()->getStatusCode()); $this->assertGreaterThan(1, $crawler->filter('li')->count()); $this->assertCount(1, $crawler->filter('form')); } Note : ceci est un nouveau test ! Tester l’existant 50 ✘ l’a!chage de la liste et du formulaire
le formulaire erroné • bind le formulaire avec la request • sauvegarder l’entité du formulaire Refactorisation : Création d’un handler pour sauvegarder un expert. Ce qu’on va tester : test list Sauvegarde du formulaire 67
objet et permet de contrôler les interactions avec l‘objet testé. • véri"er le nombre d’appels d’une méthode • spéci"er le retour de la méthode • véri"er les paramètres d’une méthode • ...
ExpertFormHandler { public function handle(FormInterface $form, Request $request) { $form->bind($request); if ($form->isValid()) { return new RedirectResponse("/experts"); } return $form; } } 86 Refactoriser l’existant ✘ bind le formulaire avec la request
le formulaire erroné ✔ bind le formulaire avec la request ✘ sauvegarder l’entité du formulaire Sauvegarde du formulaire test list 87 new ✘ génère la route avec le router
router class ExpertFormHandlerTest extends \PHPUnit_Framework_TestCase { protected $handler; protected $router; public function setUp() { $this->router = $this->getMock('Symfony\Component\Routing\RouterInterface'); $this->handler = new ExpertFormHandler($this->router); } } mock le router injecte le router
le formulaire erroné ✔ bind le formulaire avec la request ✔ génère la route avec le router ✘ sauvegarder l’entité du formulaire Sauvegarde du formulaire 95 test list
le formulaire erroné ✔ bind le formulaire avec la request ✔ génère la route avec le router ✔ sauvegarder l’entité du formulaire Sauvegarde du formulaire 102 test list