Zend_Test-PHPUnit-Testing.xml 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 20807 -->
  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 <methodname>exit()</methodname>
  72. Anweisung wenn die <methodname>gotoAndExit()</methodname> Methode 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 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. ]]></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>