Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour.
J'essaye d'utiliser les test unitaires avec PHPUnit et ZendFramework. Cependant lorsque je veut tester mon fichier avec la commande
>phpunit EntitesTest
Le message suivant apparait :
Fatal error: class 'Zend_Db_Table' not found in '.../entites.php' line 3.
Je vous joint les fichiers en question :
Mon fichier EntitesTest.php qui se situe dans MonApp/tests/application/models/
<?php require_once 'PHPUnit/Framework/TestCase.php'; require '../../../application/models/DbTable/Entites.php'; class EntitesTest extends PHPUnit_Framework_TestCase { private $_entite; public function setUp() { $this->_entite = new Model_DbTable_Entites(); } public function tearDown() { /* Tear Down Routine */ } public function testConstructeur() { $this->assertTrue(isset($this->_entite)); } public function testCrud() { $nb1 = $this->_entite->fetchAll()->count(); $this->_entite->ajouterEntite('xxxx'); $nb2 = $this->_entite->fetchAll()->count(); $this->assertTrue($nb2-$nb1=1); $id = $this->_entite->fetchAll('select Id_Entite from entite where Nom_Entite = \'xxxx\''); $obj = $this->_entite->getEntite($id); $this->assertTrue($obj[Nom_Entite]='xxxx'); if(($this->assertEqual($obj[Nom_Entite],'xxxx'))==true){ $this->_entite->editerEntite($id,'yyyy'); $obj = $this->_entite->getEntite($id); $this->assertEqual($obj[Nom_Entite],'yyyy'); $this->_entite->supprimerEntite($id); $nb3 = $this->_entite->fetchAll()->count(); $this->assertEqual($nb1,$nb3); } } }
Mon models entites.php qui se situe dans MonApp/application/models/
<?php class Model_DbTable_Entites extends Zend_Db_Table { protected $_name = 'entites'; public function getEntite($id){ $row = $this->fetchRow('Id_Entite = ' . (int)$id); if(!$row){ throw new Exception("Ligne $id non trouvée"); } return $row->toArray(); } public function ajouterEntite($nom){ $data = array('Nom_Entite' => $nom); $this->insert($data); } public function editerEntite($id, $nom){ $data = array('Nom_Entite' => $nom); $this->update($data, 'Id_Entite = ' . (int)$id); } public function supprimerEntite($id){ $this->delete('Id_Entite = ' . (int)$id); } }
Je me doute qu'il ne trouve pas ma classe. Mais je me demande surtout pourquoi etant donner qu'en temps normal grace a l'autolaider il la trouve normalement ??
Dernière modification par podo (20-07-2009 15:53:29)
Hors ligne
Pas de reponse ? Personne n'a connue ce probleme??
Hors ligne
la partie "tests" devient un module, il faut que tu le précises dans ton bootstrap (cf les posts concernant le bootstrap des modules)
Hors ligne
Mes modules sont dans "DocRoot/application/modules"
Donc le dossier Tests, qui lui est dans "DocRoot/" ne doit pas etre concidéré comme tel non?
Hors ligne
Dans la doc officielle sur Zend_Test, ils n'utilisent pas de structure modulaire et placent le répertoire /application contenant les modeles, les vues et les controleurs au meme niveau que le répertoire /tests, c'est pour cela que je suggérais de considérer tests comme un module a part entière
Après je n'ai encore jamais utilisé les tests avec ZF, peut etre que d'autres seront plus en mesure que moi de t'aider
Hors ligne
Donc mon probleme n'est toujours pas resolue, mais a avancer ceci dit...
Je sais qu'il peut etre resolu si j'arrive a simuler un bootstrap dans mes tests... Enfin un truc comme ca... Psk la c'est surtout qu'il manque l'autolaod et tout ce qui va avec qui me fait tout planter...
En effet avec de multiples 'require' j'arrive a faire fonctionner mes tests... Mais bon c'est pas très ergonomique :s
Hors ligne
Je fais remonter ce post car je viens enfin de comprendre ton problème
Je suis en effet en train de me consacrer aux tests et lorsque je lance "phpunit ControllerTest" dans ma console (sous Windows) il me dit qu'il ne trouve pas ma classe Zend_Test_PHPUnit_TestCaseController. Comme si mon include_path était ignoré totalement.
Je voudrais donc savoir si tu as résolu ton problème correctement (à savoir autrement qu'avec des require_once), ou si quelqu'un d'autre a des réponses ?
Pour info ma structure est :
application --modules --Bootstrap.php library public tests --Bootstrap.php --ControllerTest
Hors ligne
Salut
Tu peux toujours utiliser la fonction magique _autoload de php5 à la place de tes require_once pour que ce soit un peu plus propre.
La doc : http://php.net/manual/fr/language.oop5.autoload.php
Hors ligne