2015-02-11 23 views
6

我试图创建一个模拟对象,并用我的Zend Framework的应用程序中,当测试: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类,所以至少它正在拾取模拟实例。但是当我调用isAuthenticated方法时,它会抛出异常。我究竟做错了什么?

以下是错误消息我看到:

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

请发布您收到的错误...也许isAuthenticated以外的方法正在调用,但不存在。尝试确保真正的QA_class在创建模拟前已加载或可自动加载 – gontrollez 2015-02-11 15:39:04

+0

我用运行测试时收到的错误消息更新了我的问题。我也试着简单地从测试中创建一个'$ auth = new QA_Auth()'实例,并且可以确认该类正在被加载,所以肯定是可见的。 – Martyn 2015-02-12 04:27:01

+0

好吧,有点奇怪,但我一直在改变一些其他文件,现在这对我来说很有用。也许这与我的测试脚本不是一个错误。不知道是什么问题,因为它似乎没有多少好处。无论如何,感谢您的帮助,如果我找出问题所在,我会回复。我很想知道我自己。 – Martyn 2015-02-12 09:32:45

回答

4

QA_Auth::isAuthenticated()是一个静态方法,静态方法不能被嘲笑。

限制:最终,私有与静态方法

请注意,最后,私有和静态方法不能存根或嘲笑。它们被PHPUnit的测试双重功能忽略,并保留它们的原始行为。

Test Doubles

手册说,测试双打“保留其原来的行为”,而不是静态方法真。有一个open issue about it。另见PHPUnit Mock Objects and Static Methods