2010-12-15 4 views
3

Ich möchte eine Transaktions-Rollback-Methode verwenden, um meine Datenbank für Komponententests zu isolieren. Idealerweise würde ich eine Struktur etwas wie folgt verwenden:So starten und Rollback einer Datenbanktransaktion, um eine PHPUnit-Suite für Magento zu wickeln

public static function setUpBeforeClass(){ 
    Mage_Core_Model_Resource_Transaction::beginTransaction(); 
} 

public function testOne(){...} 
public function testTwo(){...} 

public static function tearDownAfterClass(){ 
    Mage_Core_Model_Resource_Transaction::rollBack(); 
} 

Leider ist die Mage_Core_Model_Resource_Transaction Klasse nicht öffentlich zugänglich gemacht wird beginnen/Funktionen rollbacktransaction. Ich kann keine öffentlichen Magento-Funktionen finden, um die Anforderung zu erfüllen. Gibt es ein Zend-Äquivalent, das funktioniert?

Ich denke, ich könnte Mage_Core_Model_Resource_Transaction umschreiben und öffentliche Wrapper für die geschützten Methoden hinzufügen, aber ich bin zögerlich, eine solche Kernklasse zu überschreiben.

Ich habe auch versucht

$this->model = Mage::getModel('model_being_tested'); 
$this->model->getResource()->beginTransaction(); 
... 
$this->model->getResource()->rollBack(); 

und dann die $this->model in den Tests verwenden, aber das nicht in statischen Funktionen verwendet werden kann.

Irgendwelche Vorschläge oder alternative Architekturen? Danke im Voraus.

Antwort

4

Ehrlich gesagt, ich werde eine Art Testsuite für Magento erstellen, um das Schreiben von Testfällen in Ihrem Modul zu ermöglichen, ohne sich um die Initialisierung und so weiter kümmern zu müssen. Natürlich habe ich wegen der Projekte nicht genug Zeit, aber ich möchte die Idee teilen, die ich bei der Datenbankanpassung verwende. Ich habe eine separate Datenbank für Komponententests erstellt (kopiert von aktuell nach Testfall), weil jeder Testfall die Anfangsdaten für ihn über Fixture lädt. Die Anmeldeinformationen für die Datenbankverbindung werden vor Mage::app()->run() eingerichtet, sodass Ihre Entwicklungskopie vor möglichen Änderungen durch Komponententests geschützt werden kann.

Sie können sich nicht auf Transaktionen verlassen, insbesondere wenn Sie ein Produkt speichern ... Es wird ein Commit-Callback für das Starten des Neuindizierungsvorgangs festgelegt, und es kann zu unvorhersehbaren Ergebnissen führen, wenn Sie keine Daten an Produkttabellen übergeben haben. Auch mysql Server kann in diesem Fall weggehen, besonders wenn Sie eine große Datenbank haben.

UPDATE:

Die Erweiterung für sie: http://www.ecomdev.org/2011/02/01/phpunit-and-magento-yes-you-can.html

+0

Dank Ivan, nützliche Informationen erneut das Produkt begehen. Ich würde gerne mit der MageTestSuite helfen, hast du ein Repo zu teilen? DM mir die Details, wenn Sie daran interessiert sind. –

+0

@ Jonathan Ich werde Ihnen SVN-Zugangsdaten senden, sobald ich in der Lage bin, die ursprüngliche Version zu erstellen. Es scheint nicht früher als Januar zu sein. –

+0

@Ivan: Bitte lassen Sie mich auch wissen, wenn Ihre Testsuite verfügbar ist. Vielleicht postest du etwas in deinem Blog? – OSdave

Verwandte Themen