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.