Stellen Sie sicher, dass sich keine Produkte in der Datenbank befinden, bevor Sie Integrationstests ausführen

7

Ich teste Unit- und Integrationstests einer Import / Export-Erweiterung mit EcomDev_PHPUnit . Bei einigen Tests muss ich sicherstellen, dass sich keine Produkte in der Datenbank befinden. Das Problem ist, dass einige Module von Drittanbietern Produkte erstellen, diese jedoch nicht anschließend bereinigen. Was ist der beste Weg, um das Problem zu umgehen?

Meiner Meinung nach wäre der sauberste Ansatz, ein Gerät zu definieren, das EcomDev_PHPUnit mitteilt, dass ich keine Produkte in der Datenbank haben möchte. So ähnlich:

eav:
  catalog_product:

Ich fürchte, dies ist nicht in EcomDev_PHPUnit implementiert. (Ist es?)

Eine andere Vermutung von mir wäre, dass ich meiner setUpMethode einen Code hinzufügen muss, der alle über die Produktkollektion verfügbaren Produkte löscht.

Am fehleranfälligsten wäre es, alle produktbezogenen Tabellen im Fixture zu definieren und sie von EcomDev_PHPUnit leeren zu lassen.

Mächtige Götter des automatisierten Testens, bitte senden Sie mir einen Hinweis!

PS: Ich weiß, dass Sie normalerweise Ergebnisse verspotten und das tatsächliche Schreiben in die Datenbank nicht testen würden. Da die Tests überprüfen sollten, ob Produkte in die von Magento als beabsichtigt erkannte Datenbank geschrieben wurden, muss ich dies vermutlich auf diese Weise tun. Ich bin sowieso offen für Vorschläge.

Matthias Zeis
quelle
Ich habe ein Skript, das alle Produkte (und Kategorien) auf SQL-Ebene löscht. Würde das funktionieren?
Brentwpeterson
Ich versuche aus bekannten Gründen, benutzerdefinierte SQL-Abfragen zu vermeiden. Sehen Sie große Vorteile (leistungs- oder anderweitig) gegenüber der Verwendung von Magento-Sammlungen und der vorherigen Deaktivierung der Indizierung?
Matthias Zeis

Antworten:

2

Um dieses Problem zu umgehen, führe ich dies in meiner setUpMethode aus:

Mage::getModel('catalog/product')->getCollection()->delete();

Beachten Sie, dass Sie dies auch wie das Magento ImportExport-Modul tun und die Fremdschlüsseleinschränkungen die Arbeit für eine bessere Leistung erledigen lassen können:

$productResource = Mage::getResourceModel('catalog/product');
$productResource->getWriteConnection()->query("DELETE FROM `{$productResource->getEntityTable()}`");

Beachten Sie, dass Sie möglicherweise etwas Magie beim Löschen von Produkten verpassen, wenn Sie die SQL-Anweisung direkt ausführen.

Matthias Zeis
quelle