# 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:

    class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        // ...

        public function testHomePage()
        {
            $this->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:

    class FooControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        // ...

        public function testBarActionShouldReceiveAllParameters()
        {
            // Setzt GET Variablen:
            $this->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:

    class MyController extends Zend_Controller_Action
    {
        public function indexAction()
        {
            if($someCondition == true) {
                return $this->_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.