2010-07-28 7 views
9

Ich habe eine Anwendung, die hinter einem Login ist und nutzt zend_acl und zend_auth.PHP Unit Testing mit Zend Auth und Zend ACL

Während des Vorversands habe ich ein ACL-Plugin, das alle Regeln für die ACL erstellt. Ich habe auch ein Auth-Plugin, das prüft, ob Sie eingeloggt sind oder nicht und wenn dies der Fall ist, wenn Sie Zugriff auf die angeforderte Ressource gemäß der ACL haben.

Da die Anwendung ist vollständig hinter einem Login die ACL nur erstellt, wenn Sie angemeldet sind.

Unit-Tests dies nicht möglich zu sein scheint, oder eher wahrscheinlich Ich bin fehlt etwas offensichtlich.

In meiner Unit-Test-Setup-Methode simuliere ich eine erfolgreiche Anmeldung, die eine zend_auth-Instanz zurückgibt. Tests, die bestanden haben, zeigen an, dass diese Anmeldung erfolgreich war.

Wenn ich dann aber durch Tests versuche, an einen anderen Ort zu versenden oder zu bewerten, ob der eingeloggte Benutzer Zugriff auf eine bestimmte Ressource hat, wird er vom Plugin immer abgelehnt, da sie noch nicht eingeloggt sind sicher, warum das ist, kann jemand beraten?

Zum Beispiel dies passiert:

public function testLoggedIn() 
{ 
    $this->assertTrue(Zend_Auth::getInstance()->hasIdentity()); 
} 

Dies schlägt fehl, da es vom Plugin abgelehnt hat:

public function testUserAccess() 
{ 

    $this->dispatch('/home'); 
      $this->assertResponseCode(200); 
      $this->assertQueryContentContains('#nav_side'); 
      $this->resetRequest() 
      ->resetResponse(); 

} 

dies, ich habe immer noch zu sein scheint Umleitung zurück auf die Login-Seite als den Plugins gefunden weiß nicht, der Benutzer ist angemeldet.

Jede Hilfe sehr geschätzt.

Antwort

3

Das Problem, das Sie beschreiben, passiert viel mit der Verwendung von globalen Variablen und der globalen OOP-Variable (dem Singleton-Muster).

Es ist ein Artikel vom Autor von PHPUnit, die beschreibt, wie Sie, dass durch die Verwendung Dependency Injection und andere Möglichkeiten, was vermeiden Sie haben und da es sehr beschreibend ist, schlage ich vor, nur Sie, es zu lesen :) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

Als hässliche Alternative (wenn Sie ein schnelles Ergebnis benötigen) können Sie einen Stub von Zend_Auth erstellen (in der Beschreibung beschreiben) und die PHP 5.3-API verwenden, um die Instanzvariable Zend_Auth auf Ihren Stub zu setzen.

Hoffnung, die hilft (wie die Frage 4h ohne andere Antwort lebte)

+0

Ja - danke das scheint das Problem zu sein. –

2

Hier ist eine weitere Möglichkeit, einen Stummel der Erstellung Ihrer ACL Plugin (oder ein Plugin) während des Tests zu ersetzen. Setzen Sie dies in Ihr ControllerTestCase und rufen Sie es im Testfall setUp auf.

Auf diese Weise wird stattdessen Ihre stub preDispatch-Methode aufgerufen, die Ihre eigentlichen Zugriffssteuerungsüberprüfungen umgeht.