Tipp #14: Registry Fixtures
Wie bereits in Tipp #1 erklärt, können Helpers, Singletons und Registry Werte pro Test zurückgesetzt werden. Die problematischen Singletons etc. zu finden war für mich oft der schwierigste Teil beim Schreiben von Integrationstests mit EcomDev, also habe ich angefangen, sie zentral in einer fixtures/registry.yaml
Datei für alle Tests zu sammeln 1. Lieber eins zu viel zurückgesetzt als eins zu wenig.
Die Datei ist aufgebaut wie folgt:
registry: registry: - product - current_product - current_category - current_entity_key helper: - catalogsearch singleton: - catalog/layer - core/session - customer/session - catalog/session - customer/session - reports/session resource: - catalog/category_indexer_product
Aber Vorsicht!
Sobald in einem Test eine der Annotationen @registry
, @helper
, @singleton
oder @resource
verwendet wird, werden die Einträge aus der YAML-Datei überschrieben. Beides gemischt zu verwenden funktioniert also nicht!
Hinterhältige Singletons
Einige nicht offensichtliche Singletons, die zu Frust führen können sind:
customer/session
– sobald man mit Product Collections arbeitet, wird automatisch die Customer Session instantiiert (wegen Gruppenpreisen). In dem Fall ist es meiner Erfahrung nach am besten, vonEcomDev_PHPUnit_Test_Case_Controller
erben zu lassen und die Customer Session wie folgt zu starten:$this->customerSession(0)
Zusätzlich gehört
customer/session
genau wie alle anderen Session Models in die Liste der zurückzusetzenden Singletons.catalog/category_indexer_producty
(Resource Singleton) – Darüber bin ich heute erst gestolpert: Laufen die Tests auf einer jungfräulichen Datenbank, werden also im selben Prozess die Setup Skripte von Magento selbst erst ausgeführt, speichert dieses Singleton die Stores bevor überhaupt der Default Store angelegt wurde. Sobald dann der Indexer ausgeführt wird, aber keine Stores findet, kommt es zu dieser vielsagenden Fehlermeldung:Fatal error: Uncaught exception 'Exception' with message 'Notice: Undefined variable: enabledTable in /var/www/app/code/core/Mage/Catalog/Model/Resource/Category/Indexer/Product.php on line 941
Deshalb sollte dieses Singleton immer zurückgesetzt werden und die Registry Fixture die dafür sorgt vor jeglicher EAV fixture geladen werden.