2015-02-11 10 views
6

फेंकता मैं एक नकली वस्तु बनाने के लिए उपयोग कोशिश कर रहा हूँ और है कि मेरे Zend फ्रेमवर्क आवेदन के भीतर जब परीक्षण:PHPUnit परीक्षण डबल PHPUnit_Framework_MockObject_BadMethodCallException

public function testAskQuestionRouteWithLoggedIn() 
{ 
    // get the mock auth object, and update the registry 
    $auth = $this->getMockBuilder('QA_Auth') 
     ->disableOriginalConstructor() 
     ->getMock(); 

    // mock methods, and return values 
    $auth->method('isAuthenticated') 
     ->will($this->returnValue(true)); 

    // update the registry 
    $auth = Zend_Registry::set('Auth', $auth); 

    // now preform the test as a logged in user 
    $this->dispatch('/ask'); 
    $this->assertController('questions'); 
    $this->assertAction('new'); 

    // // // check the page contains a question form 
    $this->assertQueryCount('form#questionForm', 1); 
} 

... लेकिन यह एक PHPUnit_Framework_MockObject_BadMethodCallException अपवाद फेंक रहा है, लेकिन वास्तव में कुछ और ज्यादा नहीं (उदाहरण के कारण क्यों)। अगर मैं अपने आवेदन के भीतर से echo get_class($auth); exit; करता हूं तो मैं देख सकता हूं कि यह Mock_QA_Auth_f4627b7b वर्ग है, इसलिए कम से कम यह नकली उदाहरण उठा रहा है। लेकिन जब मैं प्रमाणीकृत विधि कहता हूं, तो यह अपवाद फेंकता है। मैं क्या गलत कर रहा हूं?

यहाँ मैं दिखाई दे रही है त्रुटि संदेश है:

$ ./vendor/bin/phpunit tests/application/controllers/QuestionsControllerTest.php 
PHPUnit 4.4.2 by Sebastian Bergmann. 

Configuration read from /var/www/vhosts/qasystem/qasystem/tests/application/phpunit.xml 

E 

Time: 277 ms, Memory: 7.50Mb 

There was 1 error: 

1) QuestonsControllerTest::testAskQuestionRouteWithLoggedIn 
PHPUnit_Framework_MockObject_BadMethodCallException: 

/var/www/vhosts/qasystem/qasystem/application/controllers/BaseController.php:331 
/var/www/vhosts/qasystem/qasystem/application/controllers/BaseController.php:29 
/var/www/vhosts/qasystem/qasystem/application/controllers/QuestionsController.php:14 
/var/www/vhosts/qasystem/qasystem/vendor/zendframework/zendframework1/library/Zend/Controller/Action.php:133 
/var/www/vhosts/qasystem/qasystem/vendor/zendframework/zendframework1/library/Zend/Controller/Dispatcher/Standard.php:281 
/var/www/vhosts/qasystem/qasystem/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php:954 
/var/www/vhosts/qasystem/qasystem/vendor/zendframework/zendframework1/library/Zend/Application/Bootstrap/Bootstrap.php:105 
/var/www/vhosts/qasystem/qasystem/vendor/zendframework/zendframework1/library/Zend/Application.php:382 
/var/www/vhosts/qasystem/qasystem/tests/application/controllers/BaseControllerTestCase.php:67 
/var/www/vhosts/qasystem/qasystem/tests/application/controllers/QuestionsControllerTest.php:26 
+0

कृपया जो त्रुटि आप प्राप्त कर रहे हैं उसे पोस्ट करें ... शायद अन्य के अलावा एक विधि अधिकृत है, लेकिन अस्तित्व में नहीं है। यह सुनिश्चित करने का प्रयास करें कि वास्तविक QA_class लोड हो गया है या अपने मॉक – gontrollez

+0

बनाने से पहले ऑटोलोड करने योग्य है, मैंने परीक्षण चलाने के दौरान प्राप्त त्रुटि संदेश के साथ अपना प्रश्न अपडेट कर दिया है। मैंने परीक्षण से '$ auth = new QA_Auth()' उदाहरण बनाने के लिए बस कोशिश की है और यह पुष्टि कर सकता है कि कक्षा लोड हो रही है, इसलिए निश्चित रूप से दिखाई दे रहा है। – Martyn

+0

ठीक है, थोड़ा अजीब लेकिन मैं कुछ अन्य फाइलों में बदलाव कर रहा था और अब यह मेरे लिए काम कर रहा है। शायद यह मेरी टेस्ट स्क्रिप्ट के साथ कोई त्रुटि नहीं थी। निश्चित नहीं है कि समस्या क्या थी क्योंकि यह बहुत दूर नहीं लग रहा था। वैसे भी आपकी मदद के लिए धन्यवाद, अगर मुझे पता चले कि समस्या क्या है तो मैं वापस पोस्ट करूंगा। मैं खुद को जानना चाहता हूं। – Martyn

उत्तर

4

QA_Auth::isAuthenticated() एक स्थिर तरीका है, स्थिर तरीकों मज़ाक उड़ाया नहीं किया जा सकता।

सीमा: अंतिम, निजी, और स्थिर तरीकों

कृपया ध्यान दें कि, अंतिम निजी और स्थिर तरीकों टोंटदार नहीं किया जा सकता या मज़ाक उड़ाया। उन्हें PHPUnit की परीक्षण डबल कार्यक्षमता द्वारा अनदेखा किया जाता है और उनका मूल व्यवहार बनाए रखा जाता है।

Test Doubles

मैनुअल का कहना है कि परीक्षण डबल्स "उनके मूल व्यवहार को बनाए रखने", लेकिन वह स्थिर तरीकों के लिए सही नहीं है। एक open issue about it है। PHPUnit Mock Objects and Static Methods भी देखें।