2010-07-28 21 views
9

के साथ PHP यूनिट परीक्षण मेरे पास एक ऐसा एप्लिकेशन है जो लॉगिन के पीछे है और zend_acl और zend_auth का उपयोग करता है।ज़ेंड ऑथ और ज़ेंड एसीएल

प्री-डिस्पैच के दौरान मेरे पास एक एसीएल प्लगइन है जो एसीएल के लिए सभी नियम बनाता है। मेरे पास एक एथ प्लगइन भी है जो जांचता है कि क्या आप लॉग इन हैं या नहीं और यदि ऐसा है तो आपके पास एसीएल के अनुसार अनुरोधित संसाधन तक पहुंच है।

आवेदन एक लॉगिन यदि आप में।

इकाई परीक्षण किए हुए होते हैं यह असंभव, या बल्कि अधिक होने की संभावना मैं कुछ स्पष्ट याद कर रहा हूँ हो गया लगता है एसीएल केवल बनाई गई है पीछे पूरी तरह से है।

मेरी यूनिट परीक्षण सेटअप विधि में मैं एक सफल लॉगिन अनुकरण करता हूं जो zend_auth उदाहरण देता है। पास होने वाले टेस्ट इंगित करते हैं कि यह लॉगिन सफल रहा था।

हालांकि, यदि मैं परीक्षण के माध्यम से किसी अन्य स्थान पर प्रेषण करने का प्रयास करता हूं, या आकलन करता हूं कि लॉग इन उपयोगकर्ता को किसी दिए गए संसाधन तक पहुंच है तो उसे प्लगइन द्वारा हमेशा अस्वीकार कर दिया जाता है क्योंकि वे अभी भी लॉग इन नहीं हैं। मैं नहीं हूं यकीन है कि यह क्यों है, क्या कोई सलाह दे सकता है?

उदाहरण के लिए इस गुजरता है:

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

यह विफल रहता है के रूप में यह प्लगइन द्वारा अस्वीकार कर दिया गया है:

public function testUserAccess() 
{ 

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

} 

यह, मैं पाया है अभी भी प्लग इन के रूप लॉगइन पेज पर वापस पुनः निर्देशित किया जा रहा है पता नहीं है कि उपयोगकर्ता लॉग इन है।

किसी भी मदद की बहुत सराहना की।

उत्तर

3

आपके द्वारा वर्णित समस्या वैश्विक चर और ओओपी ग्लोबल वेरिएबल (सिंगलटन पैटर्न) के उपयोग के साथ बहुत कुछ होती है।

PHPUnit के लेखक का वर्णन करता है कि कैसे आप निर्भरता इंजेक्शन और क्या अन्य संभावनाओं आप हो गया और किया है का उपयोग करके कि बच सकते हैं द्वारा एक लेख नहीं है, क्योंकि यह बहुत वर्णनात्मक है, मैं सिर्फ सुझाव है कि आप इसे पढ़ने के लिए :) http://sebastian-bergmann.de/archives/882-Testing-Code-That-Uses-Singletons.html

एक बदसूरत विकल्प के रूप में (यदि आपको त्वरित परिणाम की आवश्यकता है) तो आप Zend_Auth (लिंक में वर्णित) का एक स्टब बना सकते हैं और Zend_Auth इंस्टेंस वैरिएबल को अपने स्टब पर सेट करने के लिए PHP 5.3 प्रतिबिंब API का उपयोग कर सकते हैं।

आशा है कि मदद करता है (जैसा कि प्रश्न एक अन्य उत्तर के बिना 4 रहते थे)

+0

हां- आपको लगता है कि यह मुद्दा है। –

2

यहाँ एक ठूंठ बनाने के परीक्षण के दौरान अपनी एसीएल प्लगइन (या किसी भी प्लगइन) को बदलने के लिए का एक और तरीका है। इसे अपने कंट्रोलरटेस्टकेस में रखें और उसे टेस्ट केस सेटअप में कॉल करें।

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); 
} 

इस तरह अपने ठूंठ preDispatch विधि के बजाय कहा जाता है, जो अपने वास्तविक अभिगम नियंत्रण जांच से बचने के होंगे।

संबंधित मुद्दे