2015-02-11 4 views
6

Sto cercando di creare un oggetto fittizio e l'uso che all'interno della mia applicazione Zend Framework quando il test:prova PHPUnit getta doppia 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); 
} 

... ma è gettando un'eccezione PHPUnit_Framework_MockObject_BadMethodCallException, ma in realtà non molto altro (es. motivo per cui). Se faccio un echo get_class($auth); exit; dalla mia applicazione posso vedere che è della classe Mock_QA_Auth_f4627b7b, quindi almeno sta raccogliendo l'istanza di simulazione. Ma quando chiamo il metodo isAuthenticated, lancia quell'eccezione. Che cosa sto facendo di sbagliato?

Ecco il messaggio di errore che sto vedendo:

$ ./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

Si prega di inviare l'errore che stai ottenendo ... Forse un metodo diverso da isAuthenticated viene chiamato, ma non esiste. Prova ad assicurarti che la vera QA_class sia caricata o ricaricabile automaticamente prima di crearla. – gontrollez

+0

Ho aggiornato la mia domanda con il messaggio di errore che ricevo durante l'esecuzione del test. Ho anche provato semplicemente a creare una istanza '$ auth = new QA_Auth()' dal test e posso confermare che la classe è stata caricata, quindi è certamente visibile. – Martyn

+0

Ok, un po 'strano ma stavo apportando modifiche ad altri file e ora questo funziona per me. Forse non era un errore con i miei script di test. Non sono sicuro di quale fosse il problema in quanto non sembrava dare molto. Grazie comunque per il tuo aiuto, se capisco qual è il problema, lo posterò. Mi piacerebbe conoscermi da solo. – Martyn

risposta

4

QA_Auth::isAuthenticated() è un metodo statico, metodi statici non possono essere presi in giro.

Limitazione: finale, privato e metodi statici

Si prega di notare che i metodi di finali, privati ​​e statici non possono essere stub o derisi. Vengono ignorati dalla doppia funzionalità di test di PHPUnit e mantengono il loro comportamento originale.

Test Doubles

Il manuale dice che prova raddoppia "mantengono il loro comportamento originale", ma questo non è vero per i metodi statici. C'è un open issue about it. Vedi anche PHPUnit Mock Objects and Static Methods.