2010-07-28 20 views
9

Girişimin arkasında bir uygulama var ve zend_acl ve zend_auth kullanır.PHP Zend Auth ve Zend ile Birim Testi ACL

Ön sevkiyat sırasında ACL için tüm kuralları oluşturan bir ACL eklentim var. Ayrıca oturum açıp açmadığınızı ve eğer gerekli kaynaklara ACL'ye göre erişim sağladığınızı kontrol eden bir Auth eklentisine de sahibim.

uygulaması bu imkansız, ya da ben belirgin bir şey eksik yerine daha muhtemel görünmektedir.

Birim test giriş yaptıysanız ACL sadece oluşturulan bir giriş arkasında tamamen olduğu gibi.

Ünite test kurulum yöntemimde zend_auth örneğini döndüren başarılı bir oturum açmayı simüle ediyorum. Geçiş yapan testler, bu girişin başarılı olduğunu gösterir.

Ancak, daha sonra testler aracılığıyla başka bir yere göndermeye çalışırsam veya oturum açmış olan kullanıcının belirli bir kaynağa erişip erişmediğini değerlendirirseniz, her zaman eklenti tarafından oturum açılmadığı için reddedilir. emin neden bu, kimse tavsiye edebilir?

Örneğin bu geçirir: bu eklenti tarafından reddedilmiş olarak

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

Bu başarısız:

public function testUserAccess() 
{ 

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

} 

Bu, hala eklentileri olarak giriş sayfasına geri yönlendirme gibi görünüyor bulduk kullanıcının giriş yaptığını bilmiyorum.

Herhangi bir yardım çok takdir.

cevap

3

Açıkladığınız sorun, genel değişkenlerin ve OOP genel değişkeninin (Singleton Pattern) kullanımıyla çok şey oluyor. Çok açıklayıcı olacağından başka hangi olasılıklar Eğer var ve ettik Bağımlılık Injection ve kullanarak bu önleyebilirsiniz açıklamaktadır PHPUnit yazarı tarafından bir makale var

, sadece önermek Okumak :) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

Çirkin bir alternatif olarak (hızlı bir sonuca ihtiyacınız varsa) bir Zend_Auth (bağlantıda açıkla) dizini oluşturabilir ve Zend_Auth örnek değişkenini saptamak için PHP 5.3 yansıma API'sini kullanabilirsiniz. (Soru bir başka cevabı olmayan 4H yaşamış gibi) İşte

+0

Evet, konuyla ilgili belirttiğiniz teşekkür ederim. –

2

yardımcı

Umut test sırasında ACL Eklentisi (veya herhangi bir eklenti) değiştirmek için bir saplama yaratmanın başka bir yoludur. Bunu ControllerTestCase'inize koyun ve test durumu setUp'da arayın.

public function doLogin() 
{ 
    // create a fake identity 
    $identity = new stdClass(); 
    $identity->Username = 'PHPUnit'; 
    Zend_Auth::getInstance()->getStorage()->write($identity); 

    // remove the autoloaded plugin 
    $front = Zend_Controller_Front::getInstance(); 
    $front->unregisterPlugin('My_Controller_Plugin_Acl'); 

    // create the stub for the Acl class 
    $mockaAcl = $this->getMock(
     'My_Controller_Plugin_Acl', 
     array('preDispatch'), 
     array(), 
     'My_Controller_Plugin_AclMock' 
    ); 

    // register the stub acl plugin in its place 
    $front->registerPlugin($mockAcl); 
} 

gerçek erişim denetim kontrollerini atlamak olacaktır saplama preDispatch yöntemi yerine adlandırılan bu yol.