• 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

ZF2: Wie PRG-Plugin in Action testen lassen?

Ich habe in einer Action, das PRG-Plugin eingebaut. Das funktioniert auch einwandfrei. Aber jetzt bei den Unit-Tests habe ich damit meine Probleme. Ich bekomme es nicht überprüft.

Action:
PHP:
public function displayAction()
    {
      $oRequest = $this->getRequest(); /* @var $oRequest \Zend\Http\PhpEnvironment\Request */

      $oPrg = $this->prg('/contact', true);

      if ($oPrg instanceof Response)
      {
        return $oPrg;
      }
      else if ($oPrg !== false)
      {
        $this->_oContactForm->setData($oPrg);

        if ($this->_oContactForm->isValid())
        {
          $this->_oContactDB->insert($this->_oContactForm->getObject()->getArrayCopy());

          return $this->redirect()->toRoute('home');
        }
        else
        {
          $this->logErrorForm(__METHOD__, $oRequest->getPost(), $this->_oContactForm->getMessages());
        }
      }

      $oViewModel = new ViewModel(array('oForm' => $this->_oContactForm));
      $oViewModel->setTemplate('bgform/template/form');

      return $oViewModel;
    }
Test:
PHP:
    public function testDisplayActionSuccess()
    {
      $this->initPortalSession();

      $this->dispatch('/contact',
                            'POST',
                             array('firstname' => 'TESTTEST', ...);
      $this->assertModuleName('Contact');
      $this->assertControllerName('Contact\Controller\Index');
      $this->assertControllerClass('IndexController');
      $this->assertActionName('display');
      $this->assertMatchedRouteName('contact');
      $this->assertRedirect();
      $this->assertRedirectTo('/contact');
      $this->assertResponseStatusCode(303);
   }
Wie muss ich das PRG-Plugin überprüfen, so dass ich es komplett testen kann? In der Action ruft er mir den else-if-Fall nicht auf.

Hat jemand eine Idee? Oder ein Beispiel? Habe im Internet nichts dazu gefunden.
 

[-UFO-]Melkor

New member
Hab gerade keinen Beispielcode da, aber im Endeffekt holst du dir den PluginManager aus dem ServiceManager, holst dir dann das Prg-Plugin und simulierst das Setzen der Post-Daten, indem du die den Session-Container holst und die gewünschten Daten hineinpackst (und nicht vergessen, keinen GET sondern einen POST-Request abzuschicken).
 
Ich habs soweit umgesetzt, aber leider noch nicht 100% Funktionstüchtig.

PHP:
...
$oPrg = $this->getApplicationServiceLocator()->get('ControllerPluginManager')->get('PostRedirectGet'); /* @var $oPrg \Zend\Mvc\Controller\Plugin\PostRedirectGet */
$oContainer = $oPrg->getSessionContainer();
$oContainer->post->firstname = 'Test';

$this->dispatch('/contact', 'POST', array('firstname' => 'Test');
...
Wo muss ich das Konstrukt als POST abspeichern? Ist es im dispatch() nicht richtig? Ich lande immer im IF-Fall!
 
Ja so funktioniert es.

Um das PRG komplett testen zu können, benötige ich doch folgende Fälle?
1. POST - mit den Parametern, die Eingegeben worden sind
2. GET - mit dem Setzen des Session-Containers mit den Variablen
3. Nach GET - Umleitung auf die Startseite z. B.

Oder gibt es noch mehr Fälle, die berücksichtigt werden müssen?
 

[-UFO-]Melkor

New member
Du hast vier mögliche Verzweigungen in deinem Code, also auch vier Fälle.

1. Fall: Post-Daten setzen, Redirect-Response wird zurückgegeben.
2. Fall: Keine Post-Daten vorhanden und kein Post-Request -> Anzeige des Formulars.
3. Fall: Post-Daten vorhanden und das Formular ist valide -> redirect
4. Fall: Post-Daten vorhanden und das Formular ist nicht valide.
 
Oben