© saicle/Shutterstock.com
Kolumne: Quality Time

Kolumne: Quality Time


Wer Unit Testing betreibt, lernt über kurz oder lang das PHPUnit-Mock-API [1] kennen. Damit können verschiedene Arten von Test-Doubles (Mocks, Stubs und Spies) generiert werden, um Code isoliert von allen Abhängigkeiten testen zu können. Auch wenn das PHPUnit-API alles nötige mitbringt, merkt man ihm doch an, dass es über Jahre gewachsen ist und die Abwärtskompatibilität dabei zu Recht einen hohen Stellenwert eingenommen hat. Doch mittlerweile gibt es mehrere Alternativen – mit ­Phake [2] möchte ich in dieser Kolumne eine davon vorstellen.

Eine Eigenheit von Phake, die es von anderen Double-APIs absetzt, ist die Möglichkeit, echte Spy-Objekte zu erzeugen. Dabei erfolgt die Überprüfung gestellter Erwartungen in der Verifikationsphase des Tests, also nach der Ausführung der Testaktion selbst. In PHPUnit müssen diee Erwartungen immer vorab, in der Set-up-Phase, definiert werden. Das Beispiel in Listing 1 illustriert den Unterschied.

Listing 1

public function testGetWeatherLogs() { $logger = $this->getMockBuilder('Qafoo\\Weather\\Logger') ->disableOriginalConstructor() ->getMock(); $logger->expects($this->once()) ->method('log') ->with( $this->equalTo('Fetched weather for Berlin Germany.') ); $loader = new Loader($logger); $locatedWeather = $loader->getWeatherForLocation( new Struct\Location( 'Berlin', 'Germany' ) ); }

In dieser PHPUnit-Testmethode wird zunächst mithilfe des Mock Builders ein Test-Double für die Logger-Klasse erzeugt. Anschließend werden die Erwartungen an dieses Mock-Objekt definiert: Die Methode log() soll auf dem Objekt mit dem erwarteten Parameter der Log-Nachricht aufgerufen werden. Anschließend wird das Testsubjekt (engl. „Subject of test“) erzeugt und die Testaktion ausgeführt. Die Testmethode endet ohne ersichtliche Verifikation, da die Erwartungen an den Logger Mock bereits vorab definiert werden mussten.

Listing 2

public function testGetWeatherLogs() { $logger = \Phake::mock('Qafoo\\Weather\\Logger'); $loader = new Loader($logger); $locatedWeather = $loader->getWeatherForLocation( new Struct\Location( 'Berlin', 'Germany' ) ); \Phake::verify($logger)->log('Fetched weather for Berlin Germany.'); }

Bei Phake (Listing 2) sieht der Prozess etwas anders aus. Zunächst wird ein Mock erzeugt, aber ohne Erwartungen daran zu definieren. Wie bei PHPUnit wird das Mock-Objekt zum Erzeugen des Testsubjekts verwendet und die Testaktion darauf ausgeführt. Erst dann wird Phake dazu verwendet, zu verifizieren, dass auf dem Logger die erwartete Nachr...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang