IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Tester la validation d'une entité (avec contrainte perso)


Sujet :

Doctrine2 PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Tester la validation d'une entité (avec contrainte perso)
    Bonjour à tous,

    voici mon problème.
    Pour tester le code de mon projet, je souhaite écrire un test unitaire sur une entité Doctrine avec phpunit. Plus précisément j'aimerais tester le mécanisme de validation de l'entité.

    J'ai réussit à mettre ça en place sur un premier cas simple qui contient des validations standard.

    Ci-dessous un test unitaire sur une entité qui contient des validations standard de Symfony2.
    (Je crée une entité vide et j'attends que les contraintes NotNull placées dans mon entité me retournent des erreurs.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    class AppelOffreEntityTest extends \PHPUnit_Framework_TestCase
    {
      /**
       * Crée et retourne une entité AppelOffre
       */
       private function getNewEntity()
       {
    	$taux_remuneration = new AppelOffre();
    	return $taux_remuneration;
       }
     
       /**
        * Méthode qui effectue les assert (tests) attendus
        *
        * @param TauxRemuneration $entity
        * @param boolean $assert
        * @param integer $nb_erreurs_attendues (null par défaut)
        */
       private function assertValidateEntity(AppelOffre $entity, $assert, $nb_erreurs_attendues=NULL)
       {
    	$validator = ValidatorFactory::buildDefault()->getValidator(); 
     
    	$errors = $validator->validate($entity);
    	if ( $assert==TRUE )
    	{
    		$this->assertEquals(0, count($errors));
    	}
    	elseif ( $assert==FALSE ) 
    	{
    		if ($nb_erreurs_attendues==NULL)
    		{
    			$this->assertTrue(0 < count($errors));
    		}
    		else
    		{
    			$this->assertEquals($nb_erreurs_attendues, count($errors));
    		}
    	}
       }
     
        /**
         * Test validation d'une entité vide (4 erreurs attendues)
         */
        public function testCreateEntity()
        {
        	$entity = $this->getNewEntity();
        	$this->assertValidateEntity($entity, FALSE, 4);
        }
    }
    Mon problème se situe sur des entités qui utilisent des validateurs spécifiques. Le même code me retourne une erreur m'indiquant qu'il ne trouve pas la classe du validateur en question.

    Précision: Mes validateurs sont créés avec les classes Constraint et ConstraintValidator. J'utilise ensuite le fichier service.yml pour déclarer la nouvelle contrainte. Le code fonctionne dans mes formulaires.


    J'ai bien essayé d'ajouter mes validator dans le fichier de test mais je me suis noyé dans la documentation et heurté au mécanisme d'injection de dépendance. Je ne sais pas comment reproduire ce mécanisme dans mon test.

    Quelqu'un connait-il un moyen de valider une entité qui utilise un ou plusieurs validator spécifique ? Une piste à explorer ?

    En vous remerciant de l'intérêt porté à mon message.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Aucune idée ???

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    et merci pour le lien.

    J'ai testé la classe 'KernelAwareTest' mais elle ne résouds pas mon problème. En fait, elle le résoudrait sans doute si je n'avais pas une erreur lors de la génération du schéma (sur l'execution de la méthode dropSchema().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DBALException: Unknown database type blob requested
    Ce problème a été rencontré et résolu initialement dans l'environnement de dev en ajoutant la gestion du type blob sur la base Oracle au démarrage du bundle.

    J'ai donc essayé d'ajouter le même code avant la génération du schéma dans le KernelAwareTest mais ca ne marche pas.

    Ci-dessous le code de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    abstract class KernelAwareTest extends \PHPUnit_Framework_TestCase
    {
        /**
    * @var Symfony\Component\HttpKernel\AppKernel
    */
        protected $kernel;
     
        /**
    	* @var Doctrine\ORM\EntityManager
    	*/
        protected $entityManager;
     
        /**
    	* @var Symfony\Component\DependencyInjection\Container
    	*/
        protected $container;
     
        /**
    	* @return null
    	*/
        public function setUp()
        {
            $this->kernel = new \AppKernel('test', true);
            $this->kernel->boot();
     
            $this->container = $this->kernel->getContainer();
            $this->entityManager = $this->container->get('doctrine')->getEntityManager();
     
            $this->generateSchema();
     
            parent::setUp();
        }
     
        /**
    	* @return null
    	*/
        public function tearDown()
        {
            $this->kernel->shutdown();
     
            parent::tearDown();
        }
     
        /**
    * @return null
    */
        protected function generateSchema()
        {
            $metadatas = $this->getMetadatas();
     
     
            if (!empty($metadatas)) {
                $tool = new \Doctrine\ORM\Tools\SchemaTool($this->entityManager);
    	        if (!Type::hasType("blob"))
    	        {
    	        	Type::addType('blob', 'MonProjet\MonBundle\Types\Blob');
    	        }
                $tool->dropSchema($metadatas);	// ligne originale
                $tool->createSchema($metadatas);	// ligne originale
            }
        }
     
        /**
    	* @return array
    	*/
        protected function getMetadatas()
        {
            return $this->entityManager->getMetadataFactory()->getAllMetadata();
        }
    }
    Ensuite j'ai essayé d'esquiver l'erreur pour passer à la suite.
    Je m'explique. Il n'y a qu'un seul champ de type blob dans la base, je l'ai supprimé de la base de test et j'ai également supprimé les références à ce champ dans les entités doctrine. Et j'ai toujours la même erreur.

    Du coup je ne comprends pas ce que fait le KernelAwareTest. Je croyais qu'il recréait la base de données en fonction des annotations qui sont dans mes entités. Mais étant donné que j'ai supprimé la référence au type blob dans les entité si c'était le cas je n'aurais plus cette erreur...

    As-tu une autre piste pour corriger cette erreur ?

    Merci pour le coup de main

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    tu ne peux pas configurer tes types personalisé directement dans la config?
    http://symfony.com/doc/current/cookb...-mapping-types

    Sinon en environnement de dev, le cache n'est pas vidé systématiquement, donc peut-être que ton ancien mapping est encore pris en compte.

    NB: dans le lien, il est également expliqué qu'un test unitaire n'est peut-être pas le meilleur endroit pour tester le container, et qu'il faudrait peut-être s'orienter vers les tests fonctionnels.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Oui, c'est vrai. C'est un peu lourd de charger tout ça dans un test unitaire.

    Merci pour ton aide. Je teste ca demain.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    j'ai ajouté la configuration de mes types perso dans le config.yml et vidé le cache mais j'ai toujours la même erreur lorsque je lance le teste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unknown database type blob requested, Doctrine\DBAL\Platforms\OraclePlatform may not support it.
    Du coup je vais tester la validation de mes entités avec des test fonctionnels.
    A suivre...

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Enfin la solution !

    Il faut bien partir d'un test fonctionnel.
    Ensuite on charge les validator à partir du kernel et du container et on les a tous (validator standard et perso).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    class MyTest extends Symfony\Bundle\FrameworkBundle\Test\WebTestCase
    {
        private function getKernel()
        {
            $kernel = $this->createKernel();
            $kernel->boot();
     
            return $kernel;
        }
     
        public function testCustomValidator()
        {
            $kernel = $this->getKernel();
            $validator = $kernel->getContainer()->get('validator');
     
            $violationList = $validator->validate(new RequestModel);
     
            $this->assertEquals(1, $violationList->count());
            // or any other like:
            $this->assertEquals('client not valid', $violationList[0]->getMessage());
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Struts] Tester la taille d'une List avec un Tag Logic
    Par yolepro dans le forum Struts 1
    Réponses: 5
    Dernier message: 24/08/2007, 10h28
  2. Creation d'une table avec contrainte
    Par bygui dans le forum Administration
    Réponses: 2
    Dernier message: 31/05/2006, 09h36
  3. [VB.net][VS2005] Validation d'une form avec errorProvider
    Par WriteLN dans le forum Windows Forms
    Réponses: 6
    Dernier message: 12/05/2006, 13h02
  4. Tester le résultat d'une commande avec ksh
    Par jotake dans le forum Linux
    Réponses: 3
    Dernier message: 28/09/2005, 11h59
  5. Tester l'existence d'une table avec une requête
    Par Oluha dans le forum Access
    Réponses: 6
    Dernier message: 29/08/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo