| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect2 id="zend.test.phpunit.db.adapter">
- <title>Verwenden des Datenbank Test Adapters</title>
- <para>
- Es gibt Zeiten in denen man Teile der eigenen Anwendung nicht mit einer echten Datenbank
- testen will, aber wegen einer Kopplung dazu gezwungen ist.
- <classname>Zend_Test_DbAdapter</classname> bietet einen bequemen Weg um eine Implementation
- von <classname>Zend_Db_Adapter_Abstract</classname> zu verwenden ohne das eine Datenbank
- Verbindung geöffnet werden muß. Weiters ist dieser Adapter einfach von innerhalb der
- PHPUnit Testsuite zu verwenden, da er keine Constructor Argumente benötigt.
- </para>
- <para>
- Der Test Adapter agiert als Stack für die verschiedenen Datenbank Ergebnisse. Die
- Reihenfolge der Ergebnisse muß auf Benutzerebene implementiert werden, was für Tests die
- viele unterschiedliche Datenbank Abfragen aufrufen ein arbeitsintensiver Task sein kann,
- aber er ist der richtige Helfer für Tests in denen nur eine Handvoll von Abfragen
- ausgeführt werden und man die exakte Reihenfolge der Ergebnisse kennt die vom
- Benutzerbezogenen Code zurückgegeben wird.
- </para>
- <programlisting language="php"><![CDATA[
- $adapter = new Zend_Test_DbAdapter();
- $stmt1Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
- $stmt1 = Zend_Test_DbStatement::createSelectStatement($stmt1Rows);
- $adapter->appendStatementToStack($stmt1);
- $stmt2Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
- $stmt2 = Zend_Test_DbStatement::createSelectStatement($stmt2Rows);
- $adapter->appendStatementToStack($stmt2);
- $rs = $adapter->query('SELECT ...'); // Returns Statement 2
- while ($row = $rs->fetch()) {
- echo $rs['foo']; // Prints "Bar", "Baz"
- }
- $rs = $adapter->query('SELECT ...'); // Returns Statement 1
- ]]></programlisting>
- <para>
- Das Verhalten jedes realen Datenbank Adapters wird soweit wie möglich simuliert sodas
- dessen Methoden, wie <methodname>fetchAll()</methodname>,
- <methodname>fetchObject()</methodname>, <methodname>fetchColumn</methodname> und weitere
- für den Test Adapter funktionieren.
- </para>
- <para>
- Man kann auch INSERT, UPDATE und DELETE Anweisungen im Ergebnis Stack platzieren, wobei
- diese nur ein Ergebnis zurückgeben das es erlaubt das Ergebnis von
- <methodname>$stmt->rowCount()</methodname> zu spezifizieren.
- </para>
- <programlisting language="php"><![CDATA[
- $adapter = new Zend_Test_DbAdapter();
- $adapter->appendStatementToStack(
- Zend_Test_DbStatement::createInsertStatement(1)
- );
- $adapter->appendStatementToStack(
- Zend_Test_DbStatement::createUpdateStatement(2)
- );
- $adapter->appendStatementToStack(
- Zend_Test_DbStatement::createDeleteStatement(10)
- );
- ]]></programlisting>
- <para>
- Standardmäßig ist der Abfrage Profiler aktiviert, so dass man die ausgeführte SQL Anweisung
- und deren gebundene Parameter empfangen kann um diese auf Ihre Richtigkeit bei der
- Ausführung zu prüfen.
- </para>
- <programlisting language="php"><![CDATA[
- $adapter = new Zend_Test_DbAdapter();
- $stmt = $adapter->query("SELECT * FROM bugs");
- $qp = $adapter->getProfiler()->getLastQueryProfile();
- echo $qp->getQuerY(); // SELECT * FROM bugs
- ]]></programlisting>
- <para>
- Der Test Adapter prüft niemals ob die spezifizierte Anfrage die als nächstes vom Stack
- zurückgegeben wird wirklich vom Typ SELECT, DELETE, INSERT oder UPDATE ist. Die richtige
- Reihenfolge der zurückgegebenen Daten muss vom Benutzer des Test Adapters implementiert
- werden.
- </para>
- <para>
- Der Test Adapter spezifiziert auch Methoden um die Verwendung der Methoden
- <methodname>listTables()</methodname>, <methodname>describeTables()</methodname> und
- <methodname>lastInsertId()</methodname> simuliert. Wenn man
- <methodname>setQuoteIdentifierSymbol()</methodname> verwendet kann man spezifizieren welches
- Symbol für die Kommentierung verwendet werden soll, da Standardmäßig keines verwendet wird.
- </para>
- </sect2>
|