<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 20807 -->
<sect1 id="zend.test.phpunit" xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Zend_Test_PHPUnit</title>

    <para>
        <classname>Zend_Test_PHPUnit</classname> bietet einen Testfall für <acronym>MVC</acronym>-Anwendungen,
        der Zusicherungen für Tests auf eine Vielzahl von Verantwortlichkeiten enthält. Um
        zu verstehen, was man damit machen kann, ist es wahrscheinlich am einfachsten, sich das folgende
        Beispiel anzusehen.
    </para>

    <example id="zend.test.phpunit.loginexample">
        <title>Beispiel eines Testfalls für ein Anwendungs-Login</title>

        <para>
            Das folgende ist ein einfacher Testfall für einen <classname>UserController</classname>,
            um verschiedene Dinge zu prüfen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    Das Login-Formular soll nicht-authentifizierten Benutzern angezeigt werden.
                </para>
            </listitem>

            <listitem>
                <para>
                    Wenn sich ein Benutzer einloggt, soll er zu seiner Profilseite umgeleitet
                    werden und diese Profilseite soll relevante Informationen enthalten.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Dieses spezielle Beispiel setzt ein paar Dinge voraus. Zunächst verschieben wir das meiste
            unseres Bootstrappings in ein Plugin. Das vereinfacht das Setup des Testfalls, da es uns
            erlaubt, unsere Umgebung gezielt zu definieren und die
            Anwendung mit einer einzigen Zeile zu starten. Außerdem setzt unser spezielles Beispiel auch
            voraus, dass das automatische Laden von Klassen aktiviert ist, so dass wir uns nicht um das Laden
            der benötigten Klassen kümmern müssen (wie die richtigen Controller, Plugins, usw).
        </para>

        <programlisting language="php"><![CDATA[
class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }

    public function appBootstrap()
    {
        $this->frontController
             ->registerPlugin(new Bugapp_Plugin_Initialize('development'));
    }

    public function testCallWithoutActionShouldPullFromIndexAction()
    {
        $this->dispatch('/user');
        $this->assertController('user');
        $this->assertAction('index');
    }

    public function testIndexActionShouldContainLoginForm()
    {
        $this->dispatch('/user');
        $this->assertAction('index');
        $this->assertQueryCount('form#loginForm', 1);
    }

    public function testValidLoginShouldGoToProfilePage()
    {
        $this->request->setMethod('POST')
              ->setPost(array(
                  'username' => 'foobar',
                  'password' => 'foobar'
              ));
        $this->dispatch('/user/login');
        $this->assertRedirectTo('/user/view');

        $this->resetRequest()
             ->resetResponse();
        $this->request->setMethod('GET')
             ->setPost(array());
        $this->dispatch('/user/view');
        $this->assertRoute('default');
        $this->assertModule('default');
        $this->assertController('user');
        $this->assertAction('view');
        $this->assertNotRedirect();
        $this->assertQuery('dl');
        $this->assertQueryContentContains('h2', 'User: foobar');
    }
}
]]></programlisting>

        <para>
            Dieses Beispiel könnte auch einfacher geschrieben werden -- nicht alle der gezeigten
            Zusicherungen sind notwendig. Hoffentlich zeigt es, wie einfach es sein kann, die eigene
            Anwendung zu testen.
        </para>
    </example>

    <xi:include href="Zend_Test-PHPUnit-Bootstrapping.xml" />
    <xi:include href="Zend_Test-PHPUnit-Testing.xml" />
    <xi:include href="Zend_Test-PHPUnit-Assertions.xml" />
    <xi:include href="Zend_Test-PHPUnit-Examples.xml" />
</sect1>
