PHP Unit Testen mit Zend Auth und Zend ACL

9

Ich habe eine Anwendung, die hinter einem Login steht und zend_acl und zend_auth benutzt.

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

Da sich die Anwendung vollständig hinter einer Anmeldung befindet, wird die ACL nur erstellt, wenn Sie angemeldet sind.

Das Testen dieser Einheit scheint unmöglich zu sein, oder vielmehr, ich vermisse etwas Offensichtliches.

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 er noch nicht eingeloggt ist. Ich bin mir nicht sicher Warum das ist, kann jemand raten?

Zum Beispiel geht das:

%Vor%

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

%Vor%

Dies scheint mir immer noch zur Login-Seite zurückzuleiten, da die Plugins nicht wissen, dass der Benutzer angemeldet ist.

Jede Hilfe sehr geschätzt.

    
Stephen Maher 28.07.2010, 11:38
quelle

2 Antworten

3

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

Es gibt einen Artikel des Autors von PHPUnit, der beschreibt, wie Sie das vermeiden können, indem Sie Dependency Injection verwenden und welche anderen Möglichkeiten Sie haben, und da es sehr beschreibend ist, empfehle ich Ihnen einfach, es zu lesen :) Ссылка

Als hässliche Alternative (wenn du ein schnelles Ergebnis brauchst) könntest du einen Stub von Zend_Auth erstellen (im Link beschreiben) und die PHP 5.3 Reflection API verwenden, um die Zend_Auth Instanzvariable auf deinen Stub zu setzen.

Hoffe das hilft (da die Frage 4h ohne eine andere Antwort gelebt hat)

    
edorian 28.07.2010, 16:00
quelle
2

Hier ist eine andere Möglichkeit, einen Stub zu erstellen, der Ihr ACL-Plugin (oder jedes Plugin) während des Tests ersetzt. Setzen Sie dies in Ihr ControllerTestCase und rufen Sie es im Testfall setUp auf.

%Vor%

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

    
alex.catalyst 30.01.2012 10:01
quelle