Tipp #7: YAML Verzeichnis-Fallback
YAML-Dateien für Fixtures, Expectations und Data Providers werden standardmäßig in folgendem Schema erwartet, wobei in diesem Beispiel Importer.php den Test Case enthält und testImport die Test-Methode ist:
│ Importer.php │ ├───Importer │ ├───expectations │ │ testImport.yaml │ │ │ ├───fixtures │ │ testImport.yaml │ │ │ └───providers │ testImport.yaml
Hier die Signatur mit Annotations:
/** * @param string $csv CSV file content * @test * @loadFixture * @loadExpectation * @dataProvider dataProvider */ public function testImport($csv)
Anstelle des Methodennamens kann der Dateiname der YAML-Datei jeweils explizit angegeben werden, hier z.B. in einem weiteren Test, der auch fixtures/testImport.yaml benutzt (wie das auch für Data Provider funktioniert, siehe Tipp #3).
/** * @param string $csv CSV file content * @test * @loadFixture testImport * @dataProvider dataProvider * @expectedException RuntimeException */ public function testFailingImport($csv)
Aber auch die Verzeichnisstruktur muss nicht in dieser Form genutzt werden. Findet EcomDev_PHPUnit die jeweilige Datei nämlich nicht an der Stelle, greift folgende Fallback-Hierarchie:
- Default: siehe oben
- Module: Die Verzeichnisse “fixtures”, “expectations” und “providers” werden direkt im “Test” Verzeichnis des Moduls gesucht
- Global: Die Verzeichnisse werden in sämtlichen Oberverzeichnissen des Test Cases bis hin zum Magento Root gesucht
Auf diese Weise lassen sich Fixtures etc. Test Case übergreifend verwenden. Ich bevorzuge mittlerweile zumindest für Fixtures in den meisten Fällen die zweite Variante für modulweite Definition.
Die Hierarchie ist übrigens in der config.xml von EcomDev_PHPUnit wie folgt definiert:
<config> <phpunit> <suite> <yaml> <model>ecomdev_phpunit/yaml_loader</model> <loaders> <default>ecomdev_phpunit/yaml_loader_default</default> <module>ecomdev_phpunit/yaml_loader_module</module> <global>ecomdev_phpunit/yaml_loader_global</global> </loaders> </yaml> </suite> </phpunit> </config>
Diese Loaders sind Models, die von EcomDev_PHPUnit_Model_Yaml_AbstractLoader
erben, mit einem eigenen Modul lassen sich hier also theoretisch weitere, eigene Loader hinzufügen und somit beliebige Quellen für die YAML Dateien verwenden.
3 Replies to “EcomDev_PHPUnit Tipp #7”
Comments are closed.
Sehr guter Hinweis!
Ich habe einfach den FixtureLoader überschrieben, aber diese Lösung ist wesentlich besser, da sie sich in verschiedenen Umgebungen einsetzen lässt.
In meinem Fall habe ich einen Fixture-Ordner in einem von “EcomDev” abweichenden Konvention, weshalb das Fallback-Modell nicht mehr greift.
Hast du hierzu auch eine Lösungsoption?
Grüße
Was genau ist das Problem? Mit einem eigenen Loader, der von der Konvention abweicht funktioniert das Fallback-Modell immer noch.
Wenn du das verhindern willst, kannst du wahrscheinlich auch die
<default>
,<module>
und<global>
Nodes in deiner Konfiguration überschreiben, und somit die Standard-Loader deaktivieren.Genau das habe ich gemacht. Habe einfach den Loader überschrieben. Das Problem war bei mir, dass die fixtures usw. in einem ganz anderen Ordner liegen.
ecomdev_phpunit/yaml_loader_default
ecomdev_phpunit/yaml_loader_module
mothership_phpunit/yaml_loader_recursive