Zend_Test-PHPUnit-Db-Adapter.xml 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect2 id="zend.test.phpunit.db.adapter">
  5. <title>Verwenden des Datenbank Test Adapters</title>
  6. <para>
  7. Es gibt Zeiten in denen man Teile der eigenen Anwendung nicht mit einer echten Datenbank
  8. testen will, aber wegen einer Kopplung dazu gezwungen ist.
  9. <classname>Zend_Test_DbAdapter</classname> bietet einen bequemen Weg um eine Implementation
  10. von <classname>Zend_Db_Adapter_Abstract</classname> zu verwenden ohne das eine Datenbank
  11. Verbindung geöffnet werden muß. Weiters ist dieser Adapter einfach von innerhalb der
  12. PHPUnit Testsuite zu verwenden, da er keine Constructor Argumente benötigt.
  13. </para>
  14. <para>
  15. Der Test Adapter agiert als Stack für die verschiedenen Datenbank Ergebnisse. Die
  16. Reihenfolge der Ergebnisse muß auf Benutzerebene implementiert werden, was für Tests die
  17. viele unterschiedliche Datenbank Abfragen aufrufen ein arbeitsintensiver Task sein kann,
  18. aber er ist der richtige Helfer für Tests in denen nur eine Handvoll von Abfragen
  19. ausgeführt werden und man die exakte Reihenfolge der Ergebnisse kennt die vom
  20. Benutzerbezogenen Code zurückgegeben wird.
  21. </para>
  22. <programlisting language="php"><![CDATA[
  23. $adapter = new Zend_Test_DbAdapter();
  24. $stmt1Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
  25. $stmt1 = Zend_Test_DbStatement::createSelectStatement($stmt1Rows);
  26. $adapter->appendStatementToStack($stmt1);
  27. $stmt2Rows = array(array('foo' => 'bar'), array('foo' => 'baz'));
  28. $stmt2 = Zend_Test_DbStatement::createSelectStatement($stmt2Rows);
  29. $adapter->appendStatementToStack($stmt2);
  30. $rs = $adapter->query('SELECT ...'); // Returns Statement 2
  31. while ($row = $rs->fetch()) {
  32. echo $rs['foo']; // Prints "Bar", "Baz"
  33. }
  34. $rs = $adapter->query('SELECT ...'); // Returns Statement 1
  35. ]]></programlisting>
  36. <para>
  37. Das Verhalten jedes realen Datenbank Adapters wird soweit wie möglich simuliert sodas
  38. dessen Methoden, wie <methodname>fetchAll()</methodname>,
  39. <methodname>fetchObject()</methodname>, <methodname>fetchColumn</methodname> und weitere
  40. für den Test Adapter funktionieren.
  41. </para>
  42. <para>
  43. Man kann auch INSERT, UPDATE und DELETE Anweisungen im Ergebnis Stack platzieren, wobei
  44. diese nur ein Ergebnis zurückgeben das es erlaubt das Ergebnis von
  45. <methodname>$stmt->rowCount()</methodname> zu spezifizieren.
  46. </para>
  47. <programlisting language="php"><![CDATA[
  48. $adapter = new Zend_Test_DbAdapter();
  49. $adapter->appendStatementToStack(
  50. Zend_Test_DbStatement::createInsertStatement(1)
  51. );
  52. $adapter->appendStatementToStack(
  53. Zend_Test_DbStatement::createUpdateStatement(2)
  54. );
  55. $adapter->appendStatementToStack(
  56. Zend_Test_DbStatement::createDeleteStatement(10)
  57. );
  58. ]]></programlisting>
  59. <para>
  60. Standardmäßig ist der Abfrage Profiler aktiviert, so dass man die ausgeführte SQL Anweisung
  61. und deren gebundene Parameter empfangen kann um diese auf Ihre Richtigkeit bei der
  62. Ausführung zu prüfen.
  63. </para>
  64. <programlisting language="php"><![CDATA[
  65. $adapter = new Zend_Test_DbAdapter();
  66. $stmt = $adapter->query("SELECT * FROM bugs");
  67. $qp = $adapter->getProfiler()->getLastQueryProfile();
  68. echo $qp->getQuerY(); // SELECT * FROM bugs
  69. ]]></programlisting>
  70. <para>
  71. Der Test Adapter prüft niemals ob die spezifizierte Anfrage die als nächstes vom Stack
  72. zurückgegeben wird wirklich vom Typ SELECT, DELETE, INSERT oder UPDATE ist. Die richtige
  73. Reihenfolge der zurückgegebenen Daten muss vom Benutzer des Test Adapters implementiert
  74. werden.
  75. </para>
  76. <para>
  77. Der Test Adapter spezifiziert auch Methoden um die Verwendung der Methoden
  78. <methodname>listTables()</methodname>, <methodname>describeTables()</methodname> und
  79. <methodname>lastInsertId()</methodname> simuliert. Wenn man
  80. <methodname>setQuoteIdentifierSymbol()</methodname> verwendet kann man spezifizieren welches
  81. Symbol für die Kommentierung verwendet werden soll, da Standardmäßig keines verwendet wird.
  82. </para>
  83. </sect2>