2011-11-21 14 views
5

में AuthComponent का उपयोग करता है, मैं एक नियंत्रक क्रिया का परीक्षण करने की कोशिश कर रहा हूं जो उपयोगकर्ता प्रोफाइल के संस्करण की अनुमति देता है। अन्य चीजों के अलावा मैं यह जांचना चाहता हूं कि प्रत्येक लॉग इन उपयोगकर्ता केवल अपनी प्रोफ़ाइल संपादित कर सकता है, न कि अन्य। इस प्रतिबंध को तोड़ने के मामले में कार्रवाई को पूर्वनिर्धारित होम पेज पर रीडायरेक्ट करना होगा।एक नियंत्रक के लिए इकाई परीक्षण लिखें जो केकपीएचपी 2

इस परिदृश्य के साथ

, मैं एक दृढ़ कि आईडी के साथ एक उपयोगकर्ता बनाता है = 1. इसलिए मैं प्रतिबंध इस तरह के परीक्षण पर सोच रहा था:

$data = $this->Users->User->read(null, 1); 
$this->Users->Auth->login($data); 
$this->testAction('/users/edit/2', array('method' => 'get')); 
$url = parse_url($this->headers['Location']); 
$this->assertEquals($url['path'], '/homepage'); 

परीक्षण इस ज़ोर से गुजरता है।

$this->testAction('/users/edit/1', array('method' => 'get', 'return' => 'vars')); 
$matcher = array( 
    'tag' => 'form', 
    'ancestor' => array('tag' => 'div'), 
    'descendant' => array('tag' => 'fieldset'), 
); 
$this->assertTag($matcher, $this->vars['content_for_layout'], 'The edition form was not found'); 

हालांकि इस ज़ोर विफल रहता है: तो अगले कदम अगर '/users/edit/1', जो लॉग इन उपयोगकर्ता की आईडी है क्रियान्वित की जाँच करने के लिए है, प्रपत्र को दर्शाता है। debug() के साथ खुदाई करने के बाद मुझे पता चला है कि $this->Auth->user() पूरी जानकारी देता है लेकिन $this->Auth->user('id')null देता है। चूंकि मैं बाद में कार्रवाई के भीतर तुलना में उपयोग करता हूं, यह गलत के रूप में मूल्यांकन करता है और असफल होने के लिए परीक्षण का कारण बनता है।

उत्सुक बात यह है कि यह तब होता है जब परीक्षण होता है लेकिन ब्राउज़र में कार्रवाई निष्पादित करते समय नहीं होता है। तो, इस कार्रवाई का परीक्षण करने का सही तरीका क्या है?

धन्यवाद!

$this->Auth->user('id') 

इनमें से किसी एक का प्रयास करें::

उत्तर

5

वास्तविक सही जवाब नकली वस्तुओं का उपयोग करना चाहिए के बजाय वास्तव में मैन्युअल रूप में उपयोगकर्ता के लिए लॉग इन:

$this->controller = $this->generate('Users', array(
    'components' => array('Auth' => array('user')) //We mock the Auth Component here 
)); 
$this->controller->Auth->staticExpects($this->once())->method('user') //The method user() 
    ->with('id') //Will be called with first param 'id' 
    ->will($this->returnValue(2)) //And will return something for me 
$this->testAction('/users/edit/2', array('method' => 'get')); 
मूल रूप से मैं इस तरह उपयोगकर्ता लॉग इन करना होगा

मैक का उपयोग नियंत्रक का परीक्षण करने का सबसे आसान तरीका है, और सबसे लचीला एक

अपडेट 11 मार्च 2015

तुम भी AuthComponent

के सभी विधि
$this->controller = $this->generate('Users', array(
    'components' => array('Auth') // Mock all Auth methods 
)); 
+0

यदि आपको 'जेनरेट()' का उपयोग करना है तो 'कंट्रोलरटेस्टकेस' का उपयोग करने के बाद क्या बिंदु है? – elitalon

+0

जेनरेट() केवल कंट्रोलरटेस्टकेस में उपलब्ध है और यह आपके testAction() को आसान बनाने के लिए प्रदान किया जाता है, जैसे नियंत्रक विधियों, घटकों, मॉडल इत्यादि करने में सक्षम होना। यदि आप स्वयं उत्पन्न() स्वयं को कॉल नहीं करते हैं, तो testAction () केकपीएचपी डिफ़ॉल्ट के साथ आंतरिक रूप से आपके लिए यह करेगा (_stop() और रीडायरेक्ट() फ़ंक्शन का मजाक कर रहा है) –

+0

मैंने सोचा कि 'उत्पन्न() वास्तव में कुछ और किया है। यही कारण है कि मैंने सोच रहा था कि क्यों 'नियंत्रक टेस्टकेस' ने मुझे डिफ़ॉल्ट कॉन्फ़िगरेशन प्रदान किया है। मैं आपका उत्तर आज़माउंगा और आपको बता दूंगा :) – elitalon

0
बजाय

$this->Auth->data['User']['id'] 
$this->Session->read('Auth.User.id') 
+0

यह या तो काम नहीं करता है। क्या ये विधियां बराबर नहीं हैं? – elitalon

0

इसलिए की तरह सेट यह:

$this->Users->Session->write('Auth.User', 
    array('id' => 1,'and_other_fields_you_need' => 'whatever') 
); 
0

मार्क कहानी मुझे answer in a CakePHP ticket देता है।

$data = $this->Users->User->read(null, 1); 
$this->Users->Auth->login($data['User']); 
बजाय

$data = $this->Users->User->read(null, 1); 
$this->Users->Auth->login($data); 
1

मैं Jose's answer पसंद है, लेकिन जब एक ऐसी ही स्थिति का सामना करना पड़ रहा वास्तविक AuthComponent और सत्र का उपयोग करने के लिए एक परीक्षण बनाना चाहते हैं नकली कर सकते हैं कि मुझे विश्वास दिलाएगा।

मैं नियंत्रक-आधारित प्रमाणीकरण का उपयोग कर रहा हूं, जिसका अर्थ है कि मेरे ऐप में प्रत्येक नियंत्रक को अपना isAuthorized() कॉलबैक प्रदान करना होगा। मैं MyController :: isAuthorized() का परीक्षण करना चाहता हूं। मैक्स का उपयोग करके पास करने के लिए एक परीक्षण प्राप्त करना बहुत आसान लगता है।

तो, बजाय का उपयोग कर testcase :: उत्पन्न की() नकली घटकों के साथ एक नकली नियंत्रक बनाने के लिए, मैं मार्क कहानी उत्तम लेख Testing CakePHP Controllers the hard way पीछा किया और अपने ही नकली नियंत्रक कि असली CakePHP AuthComponent के साथ एक उपयोगकर्ता में लॉग प्रदान की है।

यहां my work है। विधि परीक्षण Is प्राधिकृत() और शीर्ष के पास MockAnnouncementsController के लिए क्लास def देखें।

ऐसा लगता है कि केकपीएचपी परीक्षण ढांचे का मानना ​​है कि आप केवल अनुरोध() के माध्यम से नियंत्रकों का परीक्षण करना चाहते हैं। यह कंट्रोलर :: isAuthorized() जैसे नियंत्रक के भीतर कॉलबैक कार्यान्वयन की सीधी इकाई-परीक्षण को सुविधाजनक बनाने के लिए डिज़ाइन नहीं किया गया था, जो AuthComponent और शायद अन्य घटकों का मज़ाक उड़ाए बिना, और इससे मुझे उस विशेष विधि के परीक्षण में कम आत्मविश्वास मिलेगा। फिर भी, मुझे लगता है कि यह एक नियंत्रक के यूनिट-परीक्षण भागों के लिए एक वैध उपयोग-मामला है जो क्रियाएं नहीं हैं (जैसे "अनुक्रमणिका", "दृश्य"), लेकिन किसी घटक को प्रतिनिधि नहीं दिया जा सकता है क्योंकि उन्हें मूल रूपरेखा द्वारा बुलाया जाना चाहिए । मैं अभी भी इस बारे में सोच रहा हूं कि मैं इसे किसी भी नियंत्रक के लिए उपलब्ध कराने के लिए इसे कैसे समृद्ध कर सकता हूं।

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