Zend_Test-PHPUnit-Testing.xml 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 22741 -->
  4. <sect2 id="zend.test.phpunit.testing">
  5. <title>Testen eigener Controller und MVC Anwendungen</title>
  6. <para>
  7. Sobald man sein Bootstrap hat, kann man mit dem Testen beginnen. Testen funktioniert
  8. grundsätzlich so, wie man es in einer PHPUnit-TestSuite erwarten würde, mit ein paar kleinen
  9. Unterschieden.
  10. </para>
  11. <para>
  12. Zuerst muss man eine <acronym>URL</acronym> ausführen, die getestet werden soll, indem die
  13. <methodname>dispatch()</methodname>-Methode des Testfalls ausgeführt wird:
  14. </para>
  15. <programlisting language="php"><![CDATA[
  16. class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  17. {
  18. // ...
  19. public function testHomePage()
  20. {
  21. $this->dispatch('/');
  22. // ...
  23. }
  24. }
  25. ]]></programlisting>
  26. <para>
  27. Manchmal ist es trotzdem nötig, zusätzliche Informationen anzugeben --
  28. <constant>GET</constant> und POST Variablen, COOKIE Informationen, usw.
  29. Man kann die Anfrage mit folgenden Informationen ausstatten:
  30. </para>
  31. <programlisting language="php"><![CDATA[
  32. class FooControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  33. {
  34. // ...
  35. public function testBarActionShouldReceiveAllParameters()
  36. {
  37. // Setzt GET Variablen:
  38. $this->request->setQuery(array(
  39. 'foo' => 'bar',
  40. 'bar' => 'baz',
  41. ));
  42. // Setzt POST Variablen:
  43. $this->request->setPost(array(
  44. 'baz' => 'bat',
  45. 'lame' => 'bogus',
  46. ));
  47. // Setzt einen Cookie Wert:
  48. $this->request->setCookie('user', 'matthew');
  49. // or many:
  50. $this->request->setCookies(array(
  51. 'timestamp' => time(),
  52. 'host' => 'foobar',
  53. ));
  54. // Setzt sogar Header:
  55. $this->request->setHeader('X-Requested-With', 'XmlHttpRequest');
  56. // Setzt die Anfrage Methode:
  57. $this->request->setMethod('POST');
  58. // Ausführung:
  59. $this->dispatch('/foo/bar');
  60. // ...
  61. }
  62. }
  63. ]]></programlisting>
  64. <para>
  65. Jetzt wurde die Anfrage durchgeführt, es ist also Zeit Zusicherungen zu prüfen.
  66. </para>
  67. <sect3 id="zend.test.phpunit.testing.redirector">
  68. <title>Controller Tests und der Redirector Action Helper</title>
  69. <important>
  70. <para>
  71. Der Redirect Action Helper hat Probleme mit der Anweisung <methodname>exit()</methodname>,
  72. wenn die Methode <methodname>gotoAndExit()</methodname> verwendet wird
  73. und wird dann natürlich auch einen Test beenden, der für diese Methode läuft. Um die
  74. eigene Anwendung testbar zu machen, sollte diese Methode nicht am Redirector
  75. verwendet werden.
  76. </para>
  77. </important>
  78. <para>
  79. Durch seine Natur führt das Redirector Action Helper Plugin ein Redirect aus und steigt
  80. nach diesem aus. Weil man Teile einer Anwendung nicht testen kann, wenn diese
  81. Exit-Aufrufe durchführen, deaktiviert
  82. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> den Exit-Teil des
  83. Redirectors automatisch, was zu unterschiedlichen Verhaltensweisen in Tests und echter Anwendung
  84. führen kann. Um sicherzustellen, dass der Redirect richtig arbeitet, sollte man diesen
  85. auf folgendem Weg durchführen:
  86. </para>
  87. <programlisting language="php"><![CDATA[
  88. class MyController extends Zend_Controller_Action
  89. {
  90. public function indexAction()
  91. {
  92. if ($someCondition == true) {
  93. return $this->_redirect(...);
  94. } else if ($anotherCondition == true) {
  95. $this->_redirector->gotoSimple("foo");
  96. return;
  97. }
  98. // Mach was
  99. }
  100. }
  101. ]]></programlisting>
  102. <important>
  103. <para>
  104. Abhängig von der eigenen Anwendung kann es sein, dass das nicht genug ist, da eine
  105. zusätzliche <methodname>preDispatch()</methodname>- oder
  106. <methodname>postDispatch()</methodname>-Logik ausgeführt werden könnte. Das kann
  107. aktuell mit Zend_Test auf keine vernünftige Weise behandelt werden.
  108. </para>
  109. </important>
  110. </sect3>
  111. </sect2>