Problema con fixtures, phpunit, postgresql

Yii ver 1.1.8

PostgreSQL ver 9.0.4

PHPUnit ver. 3.5.14

PHP ver 5.3.5

Windows 7

Ho un problema che ho riscontrato via google hanno anche altri utilizzatori di Yii con PostgreSQL, ma per il quale non ho trovato una soluzione funzionante.

Sto riproducendo l’applicazione TrackStar del libro “Agile web application development with Yii and PHP5”, ma a differenza del testo che usa MySQL come db, io sto usando PostgreSQL.

La app funzia, ma c’è uno strano problema con la gestione delle fixtures per i test via PHPUnit.

Occasionalmente, ma spesso, l’esecuzione dei test mi restituisce “SQLSTATE[23503]: Foreign key violation…”.

Specifico che la app ha una tabella tbl_comment che ha una foreign key verso la tabella tbl_issue, cioè per ogni issue ci sono zero o più comment.

Sembra che il FixtureManager per qualche motivo che non comprendo cerchi di inserire le Fixtures della tabella tbl_comment prima delle fixtures della tabella tbl_issue, e quindi si crea una Foreign key violation.

Infatti se tolgo la fixture di tbl_comment tutto funzia tranne ovviamente i test sui comment.

C’è modo di intervenire sull’ordine con cui Il FixtureManager esegue le fixtures?

Grazie a tutti e buon ferragosto.

A chiunque possa interessare:

ho trovato la soluzione, anche se non è elegantissima.

Come ho riportato è il fixtureManager che esegue le fixtures in un ordine strano, quindi la soluzione è dirgli in che ordine eseguire le fixtures.

Questo si fa con un file chiamato ‘init.php’ dentro la directory “fixtures”

Nel mio caso il contenuto del file è il seguente:




<?php


// Resetto le tabelle nell'ordine voluto

$this->resetTable('trackstar_dev.tbl_comment');

$this->resetTable('trackstar_dev.tbl_issue');

$this->resetTable('trackstar_dev.tbl_project_user_assignment');

$this->resetTable('trackstar_dev.tbl_project');

$this->resetTable('trackstar_dev.tbl_user');


// Carico le tabelle nell'ordine voluto

$this->loadFixture('trackstar_dev.tbl_user');

$this->loadFixture('trackstar_dev.tbl_project');

$this->loadFixture('trackstar_dev.tbl_project_user_assignment');

$this->loadFixture('trackstar_dev.tbl_issue');

$this->loadFixture('trackstar_dev.tbl_comment');


?>



Buone ferie a tutti

Roberto