EcomDev PHPUnit Tipp #14

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

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, von EcomDev_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.