Konstruktion

Laravel 4 PHPUnit Mocking Methods with Mockery

Laravel 4 ist eines der verbreitetsten PHP-Framework derzeit am Markt (Stand August 2014). Das dieses Framework auch für die Neuentwicklung des Whisky-Archivs zum Einsatz kommt und dabei gewisse Prozesse mittels Tests abgedeckt werden sollen, bieten sich PHPUnit Tests. Als IDE wird PHPStorm verwendet.

Das Problem ist, dass bei Laravel 4 die Standard-Tests abgeleitet werden von Illuminate\Foundation\Testing\TestCase und möglicherweise durch irgendwelche Side-Effects das Mocking von Methoden nicht funktioniert wie in der PHPUnit Dokumentation angegeben. Auf der Suche nach Alternative bin ich zuerst auf die nahe liegende Lösung gestoßen:

Bei Tests die Testklasse direkt von PHPUnit_Framework_TestCase abgeleitet. Diese Herangehensweise funktioniert zwar, man verliert die gesamte Zusatz-Funktionalität aus den Laravel Framework (z.B. die Unterstützung von Routes) und ich konnte dadurch nurnoch die Models selbst testen. Da dadurch die Möglichkeiten  für die Tests stark eingeschränkt werden wurde weitergesucht.

Im Standard-Package-Verzeichnis von Composer (https://getcomposer.org/) unter  https://packagist.org/ fand ich dann ein geeignetes Tool: Mit dem Plugin Mockery sind die Erstellung von Mock aus meiner Sicht wesentlich vereinfacht und zusätzlich funktionierte nun das Mocking von Methoden (u.a. von abstrakten Klassen). Hier gleich nun ein Beispiel wie man dieses Plugin für die PHPUnit Tests einsetzen kann:


$l_obj_ClassMock = Mockery::mock('ClassName');
$l_obj_ClassMock->shouldReceive('someMethod')
->once()
->andReturn('Result');

Wer sich mit PHPUnit Tests schon ein wenig auseinander gesetzt hat, wird hier gleich erkennen was hierbei passiert. Es wird ein Mock für die Klasse ClassName erzeugt. Die Methode someMethod der Klasse ClassName wird überschrieben und gibt nun den Wert ‚Result‘ zurück.

Wer mehr über Mockery erfahren möchte, schaut einfach bei der entsprechenden GitHub-Seite vorbei.