File: Zend_Test-PHPUnit-Testing.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (131 lines) | stat: -rw-r--r-- 4,388 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 22741 -->
<sect2 id="zend.test.phpunit.testing">
    <title>Testen eigener Controller und MVC Anwendungen</title>

    <para>
        Sobald man sein Bootstrap hat, kann man mit dem Testen beginnen. Testen funktioniert
        grundsätzlich so, wie man es in einer PHPUnit-TestSuite erwarten würde, mit ein paar kleinen
        Unterschieden.
    </para>

    <para>
        Zuerst muss man eine <acronym>URL</acronym> ausführen, die getestet werden soll, indem die
        <methodname>dispatch()</methodname>-Methode des Testfalls ausgeführt wird:
    </para>

    <programlisting language="php"><![CDATA[
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // ...

    public function testHomePage()
    {
        $this->dispatch('/');
        // ...
    }
}
]]></programlisting>

    <para>
        Manchmal ist es trotzdem nötig, zusätzliche Informationen anzugeben -- 
        <constant>GET</constant> und POST Variablen, COOKIE Informationen, usw.
        Man kann die Anfrage mit folgenden Informationen ausstatten:
    </para>

    <programlisting language="php"><![CDATA[
class FooControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    // ...

    public function testBarActionShouldReceiveAllParameters()
    {
        // Setzt GET Variablen:
        $this->request->setQuery(array(
            'foo' => 'bar',
            'bar' => 'baz',
        ));

        // Setzt POST Variablen:
        $this->request->setPost(array(
            'baz'  => 'bat',
            'lame' => 'bogus',
        ));

        // Setzt einen Cookie Wert:
        $this->request->setCookie('user', 'matthew');
        // or many:
        $this->request->setCookies(array(
            'timestamp' => time(),
            'host'      => 'foobar',
        ));

        // Setzt sogar Header:
        $this->request->setHeader('X-Requested-With', 'XmlHttpRequest');

        // Setzt die Anfrage Methode:
        $this->request->setMethod('POST');

        // Ausführung:
        $this->dispatch('/foo/bar');

        // ...
    }
}
]]></programlisting>

    <para>
        Jetzt wurde die Anfrage durchgeführt, es ist also Zeit Zusicherungen zu prüfen.
    </para>

    <sect3 id="zend.test.phpunit.testing.redirector">
        <title>Controller Tests und der Redirector Action Helper</title>

        <important>
            <para>
                Der Redirect Action Helper hat Probleme mit der Anweisung <methodname>exit()</methodname>,
                wenn die Methode <methodname>gotoAndExit()</methodname> verwendet wird
                und wird dann natürlich auch einen Test beenden, der für diese Methode läuft. Um die
                eigene Anwendung testbar zu machen, sollte diese Methode nicht am Redirector
                verwendet werden.
            </para>
        </important>

        <para>
            Durch seine Natur führt das Redirector Action Helper Plugin ein Redirect aus und steigt
            nach diesem aus. Weil man Teile einer Anwendung nicht testen kann, wenn diese
            Exit-Aufrufe durchführen, deaktiviert
            <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> den Exit-Teil des
            Redirectors automatisch, was zu unterschiedlichen Verhaltensweisen in Tests und echter Anwendung
            führen kann. Um sicherzustellen, dass der Redirect richtig arbeitet, sollte man diesen
            auf folgendem Weg durchführen:
        </para>

        <programlisting language="php"><![CDATA[
class MyController extends Zend_Controller_Action
{
    public function indexAction()
    {
        if ($someCondition == true) {
            return $this->_redirect(...);
        } else if ($anotherCondition == true) {
            $this->_redirector->gotoSimple("foo");
            return;
        }

        // Mach was
    }
}
]]></programlisting>

        <important>
            <para>
                Abhängig von der eigenen Anwendung kann es sein, dass das nicht genug ist, da eine
                zusätzliche <methodname>preDispatch()</methodname>- oder
                <methodname>postDispatch()</methodname>-Logik ausgeführt werden könnte. Das kann
                aktuell mit Zend_Test auf keine vernünftige Weise behandelt werden.
            </para>
        </important>
    </sect3>
</sect2>