2016-04-19 6 views
1

In meinem Projekt habe ich eine Klasse SessionManager, die Sitzungsvariablen für Sticky Forms etc. setzt und löscht. Jede Methode in dieser Klasse nimmt ein Silex \ Application-Objekt als Parameter. Wie kann ich diese Methoden testen? Erstellen Sie ein Silex-Anwendungsobjekt in jeder Testmethode? Ich bin neu bei Silex und Unit-Tests und bin mir nicht sicher, wie ich damit umgehen soll.Unit-Test-Methode mit Silex Application als Parameter

Beispiel eines Verfahrens:

public static function setMessage($message, $messageClass, Application &$app) 
{ 
    // store message as array, with content and class keys 
    $app['session']->set('message', array(
     'content' => $message, 
     'class' => $messageClass 
    )); 
} 
+3

Müssen Sie wirklich die gesamte Anwendung bestehen? Es scheint, dass das Muster nicht wirklich gut ist. Sie sollten nur den Service/die Klasse übergeben, die Sie in Ihrer setMessage verwenden müssen. In Ihrem Fall sollten Sie die Sitzungsklasse bestehen. Wenn es sich bei der Injektion um eine "komplexe" Klasse handelt, sollten Sie bei der Prüfung des Geräts erwägen, von phpunit bereitgestellte Scheindaten zu verwenden. – olibiaz

Antwort

3

Erstens denke ich, dass $app nicht eine Abhängigkeit von Ihrem Sessionmanager sein sollte; $app['session'] sollte sein. Es sollte aber auch eine Abhängigkeit des Objekts (dh: an den Konstruktor übergeben) nicht von der einzelnen Methode sein.

Aber das ändert nichts an der Taktik zur Lösung des Problems. Alles, was Sie tun müssen, ist ein Modell der Session erstellen, die die abhängige Methode, die Sie anrufen müssen abdeckt, zB:

// in your test class 
// ... 
public function setup(){ 
    $mockedSession = $this->getMockedSession(); 
    $this->sessionManager = new SessionManager($mockedSession); 
} 

public function testMessage(){ 
    // test stuff here 
} 

private function getMockedSession(){ 
    $mockedSession = $this->getMockBuilder('\Symfony\Component\HttpFoundation\Session\Session') 
     ->disableOriginalConstructor() 
     ->setMethods(['set']) 
     ->getMock(); 

    $mockedSession->method('set') 
     ->willReturn('something testable'); 

    return $mockedSession; 
} 

Sie wahrscheinlich nur brauchen, um zu testen, dass Ihre setMessage Methode durchläuft seine $message und $messageClass Werte die verspottete Methode: Das ist alles, was es tut. In diesem Licht möchten Sie wahrscheinlich auch eine ->with('message', [$testMessage, $testClass]) oder etwas in Ihrem Mock haben. Die genaue Implementierung hängt davon ab, wie Sie testen möchten.