Kolumne: Quality Time

Objekte veräppeln
Kommentare

Wer Unit Testing betreibt, lernt über kurz oder lang das PHPUnit-Mock-API [1] kennen. Damit können die verschiedenen 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 alle nötigen Mechanismen mitbringt, merkt man ihm doch an, dass es über lange Jahre gewachsen ist und die Abwärtskompatibilität dabei zu Recht einen hohen Stellenwert eingenommen hat. Doch mittlerweile gibt es mehrere Alternativen, die einen Blick über den Tellerrand lohnenswert machen. 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. Bei diesen erfolgt die Überprüfung gestellter Erwartungen in der Verifikationsphase des Tests, also nach der Ausführung der Testaktion selbst. In PHPUnit müssen solche 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 StructLocation( '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 StructLocation( 'Berlin', 'Germany' )   );   Phake::verify($logger)->log('Fetched weather for Berlin Germany.'); }

Bei Phake (Listing 2) sieht der Prozess etwas anders aus. Auch hier wird zunächst ein Mock erzeugt, allerdings ohne Erwartungen daran zu definieren. Wie im PHPUnit-Beispiel wird anschließend das Mock-Objekt zum Erzeugen des Testsubjekts verwendet und die Testaktion darauf ausgeführt. Erst danach wird Phake dazu verwendet, zu verifizieren, dass auf dem Logger die erwartete Nachricht geloggt wurde. Diese Überprüfung findet also genau in der Phase statt, die man vom klassischen Testaufbau erwartet, was den Test einfacher lesbar macht.

Neben diesem einzelnen Aspekt, der hier hervorgehoben wurde, lesen sich Phake-Aufrufe für viele Entwickler intuitiver als ihre Pendants in anderen Systemen, was aber letztendlich Geschmackssache ist. Wer sich mit dem PHPUnit-Mock-API noch nie wirklich anfreunden konnte, sollte auf jeden Fall einen näheren Blick riskieren. Vorsicht ist allerdings bei Alleingängen geboten: Während die meisten Entwickler das PHPUnit-API kennen, kann die Einführung von Phake ohne Teamkonsens schnell zu Verwirrung führen und den Arbeitsalltag stören.

Aufmacherbild: Circular shaped 3D text around a green check mark von Shutterstock / Urheberrecht: Victor Correia

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -