• Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

PHPUnit - HttpControllerTestCaseTrait getCsrfValue() - Cannot get DOMDocument

Hallo Ralf,

ich verwende für die Unit Tests auch die HttpControllerTestCaseTrait.php. Dies hat mir noch eine größere Flexibilität beim Testen gegeben.

Leider funktioniert jetzt eine Funktionalität nach dem jüngsten Update von PHPUnit auf 6.2.2 nicht mehr.

In meinen Formularen habe ich jeweils den CSRF-Code eingebaut. Das die Formulare auch valide geprüft werden können, benötige ich natürlich den CSRF-Code, so dass das Formular auch Valide ist.

Mein Ergebnis beim Unit-Tests:
Code:
./vendor/bin/phpunit 
PHPUnit 6.2.2 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 875 ms, Memory: 16.00MB

There was 1 error:

1) XXTest\Controller\LoginControllerTest::testIndexActionSuccessfullyHandling
Zend\Dom\Exception\RuntimeException: Cannot get DOMDocument; no document registered

/xx/vendor/zendframework/zend-dom/src/Document.php:155
/xx/module/Application/test/HttpControllerTestCaseTrait.php:112
/xx/module/AdminUser/test/Controller/LoginControllerTest.php:35

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
Der dazugehörige Test-Case sieht wie folgt aus:
PHP:
public function testIndexActionSuccessfullyHandling()
        {
            $sUrl = '/de/user/login';

            $sCSRF = $this->getCsrfValue('user_login_form');

            $aPostArray = array('csrf'       => $sCSRF,
                                'username'   => '33330014',
                                'password'   => '12345678',
                                'login_user' => 'Login');

            $this->dispatch($sUrl, 'POST', $aPostArray);
            $this->assertResponseStatusCode(200);

            $this->assertMatchedRouteName('admin-user/login');
            $this->assertModuleName('adminuser');
            $this->assertControllerName(LoginController::class);
            $this->assertControllerClass('LoginController');
            $this->assertActionName(LoginResource::PRIVILEGE_INDEX);
        }
Es geht dabei um die folgende Zeile in der HttpControllerTestCaseTrait: https://github.com/zf3buch/zendframework-center/blob/chapter_18_01/module/Application/src/Test/HttpControllerTestCaseTrait.php#L145

Was mir nicht klar ist, warum auf einmal die Methode $this->getResponse()->getBody() kein Ergebnis mehr zurück liefert?

Wie bekomme ich dies wieder zum Laufen?
 
Zuletzt bearbeitet:

Ralf

New member
Hallo,

ich vermute mal, das Problem liegt daran, dass du getCsrfValue() schon vor dem dispatch() aufrufst. Die Methode ist dafür gedacht, den Wert zu ermitteln, nachdem die Verarbeitung stattgefunden hat.

Gruß,

Ralf
 

Kaiuwe

Super-Moderator
Die Methode ist dafür gedacht, den Wert zu ermitteln, nachdem die Verarbeitung stattgefunden hat.
Eine Ausnahme vom Typ „Zend\Stdlib\Exception\LogicException“ verwerfen?

(Übrigens hat dein Trait ein großes Problem: eine versteckte und komplette Abhängigkeit zu „Zend\Test\PHPUnit\Controller\AbstractControllerTestCase“ – dies Abhängigkeiten sind ein sehr häufiges Problem von Traits und auch ein Hauptargument gegen Traits.)
 

Ralf

New member
Ja, der Trait soll eigentlich zum Nachdenken und Ausprobieren dienen, wie alles im Buch, und erhebt nicht den Anspruch auf eine perfekte Lösung für alle Anwendungsfälle. Wobei das Schreiben eines Traits für das Schreiben von Tests für Zend Framework Controller kann durchaus Sinn machen. Aber du hast Recht, die Abhängigkeit ist etwas unglücklich.
 

Kaiuwe

Super-Moderator
Wobei das Schreiben eines Traits für das Schreiben von Tests für Zend Framework Controller kann durchaus Sinn machen. Aber du hast Recht, die Abhängigkeit ist etwas unglücklich.
Ich wollte den Sinn der Funktionalität selber gar nicht kritisieren, nur darauf hinweisen, dass hier das typische Problem der Abhängigkeiten innerhalb von Traits auftritt.
„In freier Wildbahn“ ist häufig zu sehen, dass bei Tests nicht immer die gleiche Strenge bei der Code-Qualität angesetzt wird, wie bei zu testendem Code. Hier zählt oft nur das (schnelle) Resultat.
 
Oben