porno porno izle rokettube
Ergebnis 1 bis 10 von 10

Thema: ZF2 PHPUnit PluginMock in Controller wird nicht gesetzt

  1. #1
    Benutzer
    Registriert seit
    13.02.2013
    Beiträge
    41
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard ZF2 PHPUnit PluginMock in Controller wird nicht gesetzt

    Hiho,

    nach vielen Stunden des Mockens und testens muss ich jetzt dochmal fragen.
    Ich habe in meinem Projekt Controller die ein Plugin benutzen (User-Plugin, hat die Identity und so weiter).
    In meinen Tests fällt mir dieses Plugin nun auf die Füße.
    Das ist der Test der fehlschlägt:
    PHP-Code:
    public function testIndexActionCanBeAccessed()
    {    
    $this->dispatch('/statistic');
        
    $this->assertResponseStatusCode(200);
        
    $this->assertModuleName('Statistic');
        
    $this->assertControllerName('StatisticController');
        
    $this->assertControllerClass('StatisticController');
        
    $this->assertMatchedRouteName('statistic');

    Der Fehler liegt daran, das das Plugin nicht ersetzt wird. Somit enthält $this->User() immer das echte Plugin statt mein Mock, das gemockte Plugin wird hier gesetzt:
    PHP-Code:
    private function setUserPlugin()
    {
        
    $authMock self::getMockBuilder('Zend\Authentication\AuthenticationService')
            ->
    disableOriginalConstructor()
            ->
    setMethods(array('hasIdentity''getIdentity'))
            ->
    getMock();

        
    $authMock->expects(self::once())
            ->
    method('hasIdentity')
            ->
    will(self::returnValue(true));

        
    $authMock->expects(self::once())
            ->
    method('getIdentity')
            ->
    will(self::returnValue(array('userid' => 1)));
        
    $sm = \StatisticTest\Bootstrap::getServiceManager();
        
    $sm->setAllowOverride(true);
        
    $sm->setService('auth_service'$authMock);

        
    $this->setApplicationMapper();

        
    $pluginMock self::getMockBuilder('Application\Controller\Plugin\UserPlugin')
            ->
    setMethods(array('__invoke''hasIdentity''getIdentity''getAuthService','setController''getController'))
            ->
    getMock();
        
    $pluginMock->expects(self::once())
            ->
    method('__invoke')
            ->
    will(self::returnValue($this->getUserMock()));
        
    $pluginMock->expects(self::once())
            ->
    method('hasIdentity')
            ->
    will(self::returnValue(true));
        
    $pluginMock->expects(self::once())
            ->
    method('getIdentity')
            ->
    will(self::returnValue(array('userid' => 1)));

        
    $sm->setAllowOverride(true);
        
    $sm->get('ControllerPluginManager')->setService('User'$pluginMock);
        
    $sm->setAllowOverride(false);

    Die funktion "setUserPlugin" wird im setUp des Tests ausgeführt:
    PHP-Code:
    public function setUp()
    {
        
    $this->setUserPlugin();
        
    $this->setServiceMock();

        
    $this->controller = new \Statistic\Controller\StatisticController();
        
    parent::setUp();

    Da ich nicht weiter weis bitte ich euch da mal um Hilfe.
    Im Moment hab ich 2 Gedanken. Entweder wird das Plugin einfach nie gesetzt, was wahrscheinlich ist da alle Testausgaben im "echten" Plugin von PHPUnit ausgeführt werden oder ich hab irgendwas entscheidendes übersehen.
    Bin euch auf jedenfall dankbar für jeden Ansatzpunkt

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    …oder ich hab irgendwas entscheidendes übersehen.
    Mir kommt das alles viel zu kompliziert vor, einiges ist auch unklar und anderes macht mir Angst.

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    PHP-Code:
    $sm = \StatisticTest\Bootstrap::getServiceManager(); 
    Was ist das?

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    PHP-Code:
    $pluginMock self::getMockBuilder('Application\Controller\Plugin\UserPlugin'
    Warum ist dies notwendig?

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    PHP-Code:
    $this->setServiceMock(); 
    Was ist das?


    Um es mal kurz zu sagen: „zend-test“ initialisiert deine komplette Anwendung und damit auch dein Kontroller-Plugin. Wenn du jetzt den Status „eingeloggt“ durchspielen möchtest, dann reicht es doch aus, im Service-Manager den „Authentication-Service“ (AuthenticationServiceInterface) zu hinterlegen / überschreiben.

    PHP-Code:
    $this->getApplicationServiceLocator()->setAllowOverride(true);
    $this->getApplicationServiceLocator()->setService(
        \
    Zend\Authentication\AuthenticationServiceInterface::class,
        
    $myAuthenticationServiceMockObject
    );
    $this->getApplicationServiceLocator()->setAllowOverride(false); 
    Das Ganze kannst du als „Trait“ umsetzen und so in deinen Testklassen wiederverwenden. (etwas Hintergrund zur Thematik Traits in Tests)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. #3
    Benutzer
    Registriert seit
    13.02.2013
    Beiträge
    41
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Um deine Fragen zu beantworten:
    Was ist das?
    $sm = \StatisticTest\Bootstrap::getServiceManager();
    Den ServiceManager aus der TestBootstrap laden. wird zum überschreiben von Services und Plugins genutzt.

    Warum ist dies notwendig?
    $pluginMock = self::getMockBuilder('Application\Controller\Plugin\UserPlugin')
    Erstellt ein Mock des UserPlugins (das was ich in den ServiceManager schreiben will).

    Warum ist dies notwendig?
    $this->setServiceMock();

    Setzt noch ein weiteres MockObjeckt

    Was ist das?

    Config 'auth_service' heist der Service bei mir, ist noch etwas älter und wird nicht per Factory erstellt aber darum geht es ja nicht (vor dem Refactorn will ich erstmal Tests schreiben).
    Im Endeffekt möchte ich sämtliche Abhängigkeiten der zu testenden Klasse mocken. Denn, ich will NUR diese Klasse testen und nicht noch anderen Code.
    Daher auch die lustigen kleinen MockObjekte und MockBuilder.
    Geändert von Matus von Matushausen (16.02.2017 um 12:14 Uhr)

  4. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Im Endeffekt möchte ich sämtliche Abhängigkeiten der zu testenden Klasse mocken. Denn, ich will NUR diese Klasse testen und nicht noch anderen Code.
    Bitte verwechsle nicht die Unit-Tests mit den Integrationstests:

    1. Wie in deinem Ausgangsbeitrag zu entnehmen ist, verwendest du „zend-test“ und dies ist zum Testen deiner MVC-Anwendung. Also genau das Zusammenspiel der Klassen und Komponenten.
    2. Um Klassen einzelnen zu testen bleibt es beim „einfachen“ PHPUnit und hier musst du die Test-Double erstellen.


    Du wirst gerade beides durcheinander!
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  5. #5
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Den ServiceManager aus der TestBootstrap laden. wird zum überschreiben von Services und Plugins genutzt.
    Für die Verwendung von „zend-test“ wird keine Bootstrap-Datei oder Klasse benötigt. Siehe dazu in der Doku.
    Den Service-Manager bekommst in deiner Testklasse über die Methode „getApplicationServiceLocator“.

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Erstellt ein Mock des UserPlugins (das was ich in den ServiceManager schreiben will).
    Bei Integrationstests nicht überschreiben, denn das Plugin soll innerhalb der Anwendung korrekt funktionieren.
    Den Test für die einzelne Klasse solltest du bereits in einem Unit-Test abgewickelt haben.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  6. #6
    Benutzer
    Registriert seit
    13.02.2013
    Beiträge
    41
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Es handelt sich bei dem Test um einen UnitTest für den Controller, keinen Integrationstest. Hab ich auch nirgends geschrieben.
    Sonst würde ich mir nciht die Mühe des Mockens machen.
    Hab meinen Fehler auch gefunden, im Controller war der ServiceLocator nicht gefüllt.

  7. #7
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Es handelt sich bei dem Test um einen UnitTest für den Controller, keinen Integrationstest. Hab ich auch nirgends geschrieben.
    Dein Ausgangsbeitrag sagt aber etwas anders:
    PHP-Code:
    public function testIndexActionCanBeAccessed()
    {    
    $this->dispatch('/statistic');
        
    $this->assertResponseStatusCode(200);
        
    $this->assertModuleName('Statistic');
        
    $this->assertControllerName('StatisticController');
        
    $this->assertControllerClass('StatisticController');
        
    $this->assertMatchedRouteName('statistic');

    Daher schloss ich darauf, dass es um Integrationstests geht.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  8. #8
    Benutzer
    Registriert seit
    13.02.2013
    Beiträge
    41
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Wenn man sich das stink normale Tutorial von ZF 2 anschaut ist das ein normaler Controllertest, der prüft ob die Action erreichbar ist. Gut kann man auch schon zu den Integrationstests zählen, ist aber sicher Ansichtssache.

  9. #9
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Gut kann man auch schon zu den Integrationstests zählen, ist aber sicher Ansichtssache.
    Wenn ich mir die „dispatch“-Methode anschaue, dann würde ich nicht von Ansichtssache reden.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  10. #10
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.513
    Thanks
    4
    Thanked 353 Times in 284 Posts

    Standard

    Zitat Zitat von Matus von Matushausen Beitrag anzeigen
    Gut kann man auch schon zu den Integrationstests zählen, ist aber sicher Ansichtssache.
    Wenn ich mir die „dispatch“-Methode anschaue, dann würde ich nicht von Ansichtssache reden.

    Und wie ich bereits oben geschrieben habe, wurde „zend-test“ zum Testen von MVC-Anwendungen entwickelt.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 10.05.2012, 18:53
  2. Controller wird nicht gefunden
    Von kakktus im Forum Installation & Konfiguration
    Antworten: 6
    Letzter Beitrag: 16.01.2012, 12:08
  3. Default Wert wird für textarea nicht gesetzt.
    Von ZF_Fan im Forum Einsteigerfragen
    Antworten: 6
    Letzter Beitrag: 26.02.2010, 19:30
  4. Db Adapter wird nicht gesetzt
    Von KeKs0r im Forum Einsteigerfragen
    Antworten: 21
    Letzter Beitrag: 03.09.2009, 14:49
  5. Baseurl wird nicht gesetzt
    Von schwaigerf im Forum MVC
    Antworten: 17
    Letzter Beitrag: 16.01.2009, 13:10

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •