Zend_Test-PHPUnit-Testing.xml 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18225 -->
  3. <!-- Reviewed: no -->
  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 wie man es in einer PHPUnit Test Suite erwarten würde, mit ein paar kleinen
  9. Unterschieden.
  10. </para>
  11. <para>
  12. Zuerst muß man eine <acronym>URL</acronym> die getestet werden soll ausführen, indem die
  13. <methodname>dispatch()</methodname> Methode des TestCases 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. Es gibt trotzdem Zeiten, , in denen man zusätzliche Informationen angeben muß -- GET und
  28. POST Variablen, COOKIE Informationen, usw. Man kann die Anfrage mit diesen Informationen
  29. 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 Behauptungen 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 <code>exit()</code> Anweisung wenn
  72. die <methodname>gotoAndExit()</methodname> Methode verwendet wird, und wird dann
  73. natürlich auch einen Test beenden der für diese Methode läuft. Um die eigene
  74. Anwendung testbar zu machen sollte diese Methode nicht am Redirector verwendet
  75. 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 Exit
  81. Aufrufe durchführen, schaltet
  82. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> den Exit Teil des
  83. Redirectors was zu unterschiedlichen Verhaltensweisen in Tests und echter Anwendung
  84. führen kann. Um sicherzustellen das 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. ]]>
  102. </programlisting>
  103. <important>
  104. <para>
  105. Abhängig von der eigenen Anwendung kann es sein dass das nicht genug ist da eine
  106. zusätzliche <code>preDispatch()</code> oder <code>postDispatch()</code> Logik
  107. ausgeführt werden könnte. Das kann aktuell mit Zend_Test auf keine vernünftige Weise
  108. behandelt werden.
  109. </para>
  110. </important>
  111. </sect3>
  112. </sect2>
  113. <!--
  114. vim:se ts=4 sw=4 et:
  115. -->