Testen eigener Controller und MVC Anwendungen
Sobald man sein Bootstrap hat, kann man mit dem Testen beginnen. Testen funktioniert
grundsätzlich wie man es in einer PHPUnit Test Suite erwarten würde, mit ein paar kleinen
Unterschieden.
Zuerst muß man eine URL die getestet werden soll ausführen, indem die
dispatch() Methode des TestCases ausgeführt wird:
dispatch('/');
// ...
}
}
]]>
Es gibt trotzdem Zeiten, , in denen man zusätzliche Informationen angeben muß -- GET und
POST Variablen, COOKIE Informationen, usw. Man kann die Anfrage mit diesen 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 Behauptungen zu prüfen.
Controller Tests und der Redirector Action Helper
Der Redirect Action Helper hat Probleme mit der exit()
Anweisung wenn die gotoAndExit() Methode 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, schaltet
Zend_Test_PHPUnit_ControllerTestCase den Exit Teil des
Redirectors was zu unterschiedlichen Verhaltensweisen in Tests und echter Anwendung
führen kann. Um sicherzustellen das 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.