Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] [Résolu] jDao + phpUnit + destructeur

Posted by khena on 03/29/2013 16:59

Bonjour à tous,

Voilà un problème un peu complexe, dont je n'arrive pas à savoir si l'erreur vient de chez moi, de Jelix, de PHPUnit, ou de PHP...

L'objectif de mon objet et de ses héritiers est de faciliter la sauvegarde en SQL : à chaque fois que l'objet sera détruit, il sera écrit en SQL (sans nécessité d'appeler la fonction save())

Tout d'abord ma config : Jelix 1.4.4 + mysql configuré avec mysqli (sans pdo ni connexion persistente) (j'ai la même erreur en mysql ou avec pdo)

J'ai deux objets (volontairement simplifié)

abstract class parent{

    public $id; 
   
    public __construct($id = null){
         if(!empty($id)){
                $this->id = $id;
                $this->load();
         }

    }

    public __destruct(){
       $this->push();
    }
    abstract protected function push();
    abstract protected function load();

    public function save(){
	    $this->push();
		return $this->id;     
    }
}

et

class enfant extends parent{
        public $name;

	protected function push(){
            $f = jDao::get("monmodule~mondao");
            if(empty($this->id)){
                    $record = jDao::createRecord("monmodule~mondao");
		    $record->name = $this->name;
		    $f->insert($record);
		    $this->id = $record->id;
            }else{
		$record = $f->get($this->id);
		$record->name = $this->getName();
		$f->update($record);
            }
        }

        protected function load( ){
	  $f = jDao::get("monmodule~mondao");
	  $record = $f->get($this->id);
	  $this->name = $record->name;
	}
}

Mes tests unitaires :

class ActionTypeTest extends PHPUnit_Framework_TestCase{
	
	public function testCreate(){
		$e = new enfant();
		$e->name = "TOTO";
		$id = $e->save();
		unset($e);		
		$this->assertInternalType("int",$id);
		
	}
	
	public function testUpdate(){
		
                // crée un nouveau record
		$e = new enfant();
		$e->name = "TOTO";
		$id = $e->save();
		unset($e);
                
                // récupère le record créé et le modifie (théoriquement)
		$e = new enfant($id);
		$e->name = "TATA";
		unset($e);

                // récupère l'item modifié pour comparaison
		$e = new enfant($id);
		$name = $e->name;
		unset($e);

		$this->assertEquals("TATA",$name);
	}
}

C'est là que les choses se corsent...

  1. testCreate() fonctionne toujours
  2. testUpdate() plante avec ce beau message

Warning: mysqli::query(): Couldn't fetch mysqli in /home/gperes/Documents/jelix/jelix-1.4.4-dev/lib/jelix/plugins/db/mysqli/mysqli.dbconnection.php on line 121 avec mysqli ( ou Warning: mysql_select_db(): 266 is not a valid MySQL-Link resource in /home/gperes/Documents/jelix/jelix-1.4.4-dev/lib/jelix/plugins/db/mysql/mysql.dbconnection.php on line 107 avec mysql)

  1. testUpdate() fonctionne si je rajoute $e->save(); sous $e->name("TATA"); dans mon test unitaire
  2. testUpdate() ne fonctionne pas mais n'affiche pas de message d'erreur si j'enleve le testCreate();
  3. testUpdate() fonctionne si je ne change rien mais que je fais un create au lieu d'un update

Pour être tout fait précis, l'erreur provient sur la fonction enfant->save() lors du $record = $f->get($this->id); (id est bien initialisé)

Je pense que la connexion à jDao doit être fermé / réinitialisé à un moment, et que le get ne réouvre pas cette connexio, mais j'ai beau tracé dans les libs jelix, je n'arrive pas à voir où ça pêche...

  [Opened] jDao + phpUnit + destructeur

Reply #1 Posted by laurentj on 03/31/2013 16:51

Bonjour,

Il y a plusieurs "AT" qui traine dans ton code et tes explications et qui rendent forcément incoherent ton code source... Peux tu corriger s'il te plait, pour qu'on soit sûr que ce n'est qu'un mauvais copié collé, et pas finalement ces bugs qui provoquent ton problème...

je rajoute $id = $oAt->save(); sous $id = $oAt->save();

Tu rajoutes deux fois la même ligne ??

testUpdate() plante avec ce beau message

Et la stack, elle dit quoi ?

  [Opened] jDao + phpUnit + destructeur

Reply #2 Posted by khena on 04/02/2013 09:30

Désolé pour le mauvais copié/collé du vendredi soir, j'espère ne pas avoir fait d'autre boulette dans ma simplification. Le post est maintenant à jour.

La stack :

Warning: mysqli::query(): Couldn't fetch mysqli in /jelix/jelix-1.4.4-dev/lib/jelix/plugins/db/mysqli/mysqli.dbconnection.php on line 121

Call Stack:
    0.0001     228520   1. {main}() /projet/tests/runtests.php:0
    0.1032    1246152   2. require('/jelix/jelix-1.4.4-dev/lib/jelix-tests/phpunit.inc.php') /projet/tests/runtests.php:5
    0.2088    2868416   3. jelix_TextUI_Command::main() /jelix/jelix-1.4.4-dev/lib/jelix-tests/phpunit.inc.php:57
    0.2088    2879376   4. PHPUnit_TextUI_Command->run() /jelix/jelix-1.4.4-dev/lib/jelix-tests/classes/command.php:48
    1.0702    7219912   5. parent->__destruct() /projet/modules/monmodule/classes/parent.class.php:0
    1.0702    7219912   6. enfant->push() /projet/modules/monmodule/classes/parent.class.php:83
    1.0703    7219912   7. jDaoFactoryBase->get() /projet/modules/monmodule/classes/enfant.class.php:23
    1.0703    7220776   8. jDbConnection->query() /jelix/jelix-1.4.4-dev/lib/jelix/dao/jDaoFactoryBase.class.php:214
    1.0703    7227640   9. mysqliDbConnection->_doQuery() /jelix/jelix-1.4.4-dev/lib/jelix/db/jDbConnection.class.php:113
    1.0704    7227688  10. mysqli->query() /jelix/jelix-1.4.4-dev/lib/jelix/plugins/db/mysqli/mysqli.dbconnection.php:121

  [Opened] jDao + phpUnit + destructeur

Reply #3 Posted by khena on 04/10/2013 15:19

Pour information, je viens de basculer en sqlite3 via le driver pdo, je n'ai plus d'exception mais mon test ne fonctionne toujours pas :(

Je continue de chercher, à priori je m'oriente donc plutot vers une connexion fermée lors de l'appel au destructeur.

  [Opened] [[Résolu]] jDao + phpUnit + destructeur

Reply #4 Posted by khena on 05/10/2013 17:04

Un petit bug masquait un bug plus profond dans mon code. La première exception a été corrigé lors du changement de mysqli vers sqlite3+pdo (pb de config sur mon poste).

J'ouvre un autre ticket / post pour le deuxieme si nécessaire.

 
Page
  1. jDao + phpUnit + destructeur