Testen eigener Controller und MVC Anwendungen
Sobald man sein Bootstrap hat, kann man mit dem Testen beginnen. Testen funktioniert
grundsätzlich so, wie man es in einer PHPUnit-TestSuite erwarten würde, mit ein paar kleinen
Unterschieden.
Zuerst muss man eine URL ausführen, die getestet werden soll, indem die
dispatch()-Methode des Testfalls ausgeführt wird:
dispatch('/');
// ...
}
}
]]>
Manchmal ist es trotzdem nötig, zusätzliche Informationen anzugeben --
GET und POST Variablen, COOKIE Informationen, usw.
Man kann die Anfrage mit folgenden Informationen ausstatten:
request->setQuery(array(
'foo' => 'bar',
'bar' => 'baz',
));
// Setzt POST Variablen:
$this->request->setPost(array(
'baz' => 'bat',
'lame' => 'bogus',
));
// Setzt einen Cookie Wert:
$this->request->setCookie('user', 'matthew');
// or many:
$this->request->setCookies(array(
'timestamp' => time(),
'host' => 'foobar',
));
// Setzt sogar Header:
$this->request->setHeader('X-Requested-With', 'XmlHttpRequest');
// Setzt die Anfrage Methode:
$this->request->setMethod('POST');
// Ausführung:
$this->dispatch('/foo/bar');
// ...
}
}
]]>
Jetzt wurde die Anfrage durchgeführt, es ist also Zeit Zusicherungen zu prüfen.
Controller Tests und der Redirector Action Helper
Der Redirect Action Helper hat Probleme mit der Anweisung exit(),
wenn die Methode gotoAndExit() verwendet wird
und wird dann natürlich auch einen Test beenden, der für diese Methode läuft. Um die
eigene Anwendung testbar zu machen, sollte diese Methode nicht am Redirector
verwendet werden.
Durch seine Natur führt das Redirector Action Helper Plugin ein Redirect aus und steigt
nach diesem aus. Weil man Teile einer Anwendung nicht testen kann, wenn diese
Exit-Aufrufe durchführen, deaktiviert
Zend_Test_PHPUnit_ControllerTestCase den Exit-Teil des
Redirectors automatisch, was zu unterschiedlichen Verhaltensweisen in Tests und echter Anwendung
führen kann. Um sicherzustellen, dass der Redirect richtig arbeitet, sollte man diesen
auf folgendem Weg durchführen:
_redirect(...);
} else if ($anotherCondition == true) {
$this->_redirector->gotoSimple("foo");
return;
}
// Mach was
}
}
]]>
Abhängig von der eigenen Anwendung kann es sein, dass das nicht genug ist, da eine
zusätzliche preDispatch()- oder
postDispatch()-Logik ausgeführt werden könnte. Das kann
aktuell mit Zend_Test auf keine vernünftige Weise behandelt werden.