Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfo4] Tests unitaires

besoin d'aide pour mon premier test unitaire

    21 mars 2019 à 15:54:22

    Bonjour

    J'aurai besoin d'un coup de pouce pour créer mon premier test unitaire. Les exemples que je trouve porte sur des fonctions simplissimes et du coup, quand je suis sur mon projet, ca se complique

    Détail de la class que je veux tester : 

    Le Service "ServiceBooking" comporte 3 fonctions

    -> CalculAge pour calculer l'age d'une personne en fonction de sa date de naissance renseignée dans un formulaire

    - > CalculTicketPrice pour calculer le prix de son ticket d'entrée en fonction de son âge, d'une éventuelle réduction ($reducedprice) et d'une visite journée ou demiejournée ($ticketprice)

    -> Update qui additionne le prix de chaque billet de la commande pour sortir un prix de commande globale

    Voici le code 

    <?php
    
    namespace App\Service;
    
    use DateTime;
    use DateInterval;
    use App\Entity\Ticket;
    use App\Entity\Booking;
    use Doctrine\ORM\EntityManagerInterface;
    use Doctrine\ORM\EntityManager;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Validator\Constraints\Date;
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    
    
    class ServiceBooking {
    			
    	private $entityManager;
    
    	public function __construct(EntityManagerInterface $entityManager){
    		$this->entityManager = $entityManager;
    	}
    
    	public function create(Booking $booking){
    		$this->update($booking);
    		$this->entityManager->persist($booking);		
    		$this->entityManager->flush();		
    	}
    
    	public function CalculAge(Ticket $ticket)
    	// on recupère les dates et on calcule l'âge du visiteur
    	{
    		$datetime1 = $ticket->getBirthdate();
    		$datetime2 = new DateTime('now');
    		$age = $datetime1->diff($datetime2);
    		return $age->format('%y');
    	}
    
    	public function CalculPriceTicket(Ticket $ticket)
    	// on récupère l'age du visiteur et on calcule le prix de son billet
    	{
    		$age = $this->CalculAge($ticket);
    		$ticketprice = $ticket->getTicketprice();
    		$reducedprice = $ticket->getReducedprice();
    		
    				if ($age < 4) {	
    					$priceTicket = 0;
    				}					
    				elseif ($age > 3 & $age < 12) {
    					if ($ticketprice == false) {
    						$priceTicket = 4;
    					}
    					else {
    						$priceTicket = 8;
    					}
    					
    				}					
    				elseif ($age > 59) {
    					if ($ticketprice == false) {
    						$priceTicket = 6;
    					}
    					elseif ( $reducedprice == true) {
    						$priceTicket = 10;
    					}	
    					else {
    						$priceTicket = 12;
    					}
    				}
    					
    				else {
    					if ($ticketprice == false) {
    						$priceTicket = 8;
    					}
    					elseif ( $reducedprice == true) {
    						$priceTicket = 10;
    					}	
    					else {
    						$priceTicket = 16;
    					}
    				}
    		
    		return $priceTicket;		
    	}
    
    
    	public function update(Booking $booking): Booking 		
    	{
    		//on recupère le prix de chaque billet et on les ajoute pour avoir le prix total de la commande
    		$tickets = $booking->getTickets();
    		$total = 0;
    
    		foreach($tickets as $ticket)
    		{
    			$oneprice = $this->CalculpriceTicket($ticket);
    			// $ticket->setPrice($oneprice); si on a besoin du prix par ticket
    			// ajouter le prix de chaque ticket il faut persister et flush les tickets
    			$total = $total + $oneprice;
    		}
    		$booking->setTotalPrice($total);
    
    		return $booking;
    	}
    }	

    J'aimerai tester la function CalculTicketPrice (-> ce qui me parait plutôt simple pour commencer :D )

    J'ai installer phpunit

    J'ai crée un fichier Tests/Service/ServiceBookingTest dont voici le contenu

    <?php
    
    namespace App\Tests\Service;
    
    use App\Service\ServiceBooking; 
    use PHPUnit\Framework\TestCase;
    
    class ServiceBookingTest extends TestCase 
    {
       public function TestCalculPriceTicket(Ticket $ticket)
       {
           $servicebooking = new ServiceBooking;
           $result = $servicebooking->CalculTicketPrice();
    
            $this->assertEquals(xxx , 0);
            $this->assertEquals(xxx , 4);
            $this->assertEquals(xxx , 6);
            $this->assertEquals(xxx , 8);
            $this->assertEquals(xxx , 10);
            $this->assertEquals(xxx , 12);
            $this->assertEquals(xxx , 16);
       }
    }

    Sachant que 0, 4, 6, 8 10, 12, 16 sont toutes les options possibles de prix d'un billet en fonction de l'âge, de la réduction de prix et d'une visite journée/demie-journée

    Ma question (enfin!) : Je ne sais pas comment remplir les "xxx" dans mes assertEquals ? 

    Pouvez-vous m'aider ?


    • Partager sur Facebook
    • Partager sur Twitter
    Je poursuis des émotions, je trébuche dans des regards et je collectionne des cicatrices
      21 mars 2019 à 19:15:47

      bonjour,

      le xxxx c'est ce que tu attends comme résultat et en second paramètre de assertEqual c'est le résultat d'un calcul issue d'une méthode.Par exemple pour un enfant né le 21/02/2019, le prix attendu est  0(d'après ta méthode de calcul).

      Il faut commencer par instancier  Ticket et lui fournir un setter avec une date de naissance:

      public function testCalulPrixDuTicketPourMoinsDe3A( )
          {
              $ticket=new Ticket();
              $ticket->setBirthdate('2019-02-21'); // moins de 3a
              $ticket->setReducedprice(false);
              $servicebooking = new ServiceBooking();
              $result = $servicebooking->CalculTicketPrice($ticket); // prix du ticket calculé en fct de la date de naissance
              $this->assertEquals(0, $result); // prix du ticket attendu = 0
          }

      Il faut écrire une méthode  de test par âge mais en général  pour ne pas avoir à écrire autant de tests que des âges à tester ,on utilise des dataProviders ( des paramètres de la méthode à tester qui proviennent d'une méthode quelconque de la classe de teste ).

      au passage ta méthode de calcul de l'âge prends en compte une date dans le futur ce qui entraîne un âge négatif, il penser soit à créer une exception soit faire un return;

      -
      Edité par armel.mc 21 mars 2019 à 19:22:47

      • Partager sur Facebook
      • Partager sur Twitter
        22 mars 2019 à 10:02:36

        Une réponse plus claire et pédagogue, on ne fait pas je crois.

        Grand merci Armel, je vais avancer là-dessus et je posterai le résultat quand j'y serai

        • Partager sur Facebook
        • Partager sur Twitter
        Je poursuis des émotions, je trébuche dans des regards et je collectionne des cicatrices

        [Symfo4] Tests unitaires

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown