| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: 20807 -->
- <sect2 id="zend.test.phpunit.bootstrapping">
- <title>Bootstrapping der eigenen Testfälle</title>
- <para>
- Wie im <link linkend="zend.test.phpunit.loginexample">Login-Beispiel</link> gezeigt, sollten
- alle <acronym>MVC</acronym>-Testfälle
- <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> erweitern. Diese Klasse
- ihrerseits erweitert <classname>PHPUnit_Framework_TestCase</classname> und gibt einem alle
- Strukturen und Zusicherungen, die man von PHPUnit erwartet -- sowie einiges an Scaffolding und
- Zusicherungen, die genau auf die Zend Framework <acronym>MVC</acronym>-Implementation zugeschnitten sind.
- </para>
- <para>
- Um die eigene <acronym>MVC</acronym>-Anwendung zu testen, muß diese ein Bootstrap ausführen.
- Es gibt verschiedene Wege, dies zu tun, wobei sich alle der öffentlichen
- <varname>$bootstrap</varname>-Eigenschaft bedienen.
- </para>
- <para>
- Erstens und möglicherweise am zielgerichtetsten kann man einfach eine Instanz von
- <classname>Zend_Application</classname> erstellen, wie man es in der
- <filename>index.php</filename> machen würde und diese der <varname>$bootstrap</varname>-Eigenschaft
- zuweisen. Normalerweise macht man das in der <methodname>setUp()</methodname>-Methode;
- anschließend muss man <methodname>parent::setUp()</methodname> aufrufen:
- </para>
- <programlisting language="php"><![CDATA[
- class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
- {
- public function setUp()
- {
- // Zuordnen und Initiieren in einem Schritt:
- $this->bootstrap = new Zend_Application(
- 'testing',
- APPLICATION_PATH . '/configs/application.ini'
- );
- parent::setUp();
- }
- }
- ]]></programlisting>
- <para>
- Zweitens kann diese Eigenschaft so gesetzt werden, dass sie auf eine Datei zeigt. Wenn dieser
- Weg gewählt wird, sollte diese Datei <emphasis>nicht</emphasis> den Front-Controller ausführen,
- sondern stattdessen den Front-Controller konfigurieren und alles, was die Anwendung an
- speziellen Anforderungen benötigt.
- </para>
- <programlisting language="php"><![CDATA[
- class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
- {
- public $bootstrap = '/path/to/bootstrap/file.php'
- // ...
- }
- ]]></programlisting>
- <para>
- Drittens kann ein <acronym>PHP</acronym>-Callback angegeben werden, der nach dem Bootstrap
- der Anwendung ausgeführt wird. Diese Methode kann im <link
- linkend="zend.test.phpunit.loginexample">Login-Beispiel</link> gesehen werden. Wenn das
- Callback eine Funktion oder statische Methode ist, könnte sie auch in der Klasse gesetzt
- werden:
- </para>
- <programlisting language="php"><![CDATA[
- class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
- {
- public $bootstrap = array('App', 'bootstrap');
- // ...
- }
- ]]></programlisting>
- <para>
- In Fällen, in denen eine Objektinstanz notwendig ist, empfehlen wir die Durchführung in der
- eigenen <methodname>setUp()</methodname>-Methode:
- </para>
- <programlisting language="php"><![CDATA[
- class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
- {
- public function setUp()
- {
- // Verwende die 'start' Methode einer Bootstrap-Objektinstanz:
- $bootstrap = new Bootstrap('test');
- $this->bootstrap = array($bootstrap, 'start');
- parent::setUp();
- }
- }
- ]]></programlisting>
- <para>
- Man beachte, dass <methodname>parent::setUp()</methodname> aufgerufen wird; das ist notwendig, da
- die <methodname>setUp()</methodname>-Methode von
- <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> den Rest des Bootstrap-Prozesses
- durchführen wird (was den Aufruf des Callbacks einschließt).
- </para>
- <para>
- Während der normalen Anwendung wird die <methodname>setUp()</methodname>-Methode das
- Bootstrap der Anwendung ausführen. Dieser Prozess wird zunächst das Löschen der Umgebung
- enthalten, um einen sauberen Anfragestatus zu erhalten, das Zurücksetzen aller Plugins, Helfer
- und Antwortobjekte. Sobald das getan wurde, wird sie anschließend die Datei mit
- <methodname>include()</methodname> laden, die in <varname>$bootstrap</varname> angegeben
- ist oder den spezifizierten Callback aufrufen.
- </para>
- <para>
- Das Bootstrappen sollte so nahe wie möglich daran sein, wie die Anwendung das Bootstrap
- durchführt. Trotzdem gibt es einige Fallstricke:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Wir bieten keine alternative Implementierung der Anfrage- und Antwortobjekte; diese
- werden nicht verwendet. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
- verwendet eigene Anfrage- und Antwortobjekte,
- <classname>Zend_Controller_Request_HttpTestCase</classname> und
- <classname>Zend_Controller_Response_HttpTestCase</classname>. Diese Objekte stellen
- Methoden zur Verfügung, um die Anfrageumgebung gezielt aufzusetzen und um auf
- speziellem Weg die Antwort als Prüfgegenstand abzuholen.
- </para>
- </listitem>
- <listitem>
- <para>
- Man sollte nicht erwarten Server-spezifisches zu testen. Mit anderen Worten, die Tests
- garantieren nicht, dass der Code in einer speziellen Serverkonfiguration läuft, aber
- dass die Anwendung wie erwartet funktionieren sollte und der Router eine gegebene
- Anfrage routen kann. Aus diesem Grund sollten keine Server-spezifischen Header im
- Anfrageobjekt gesetzt werden.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Sobald die Anwendung das Bootstrapping ausgeführt hat, kann damit begonnen werden, eigene
- Tests zu erstellen.
- </para>
- </sect2>
|