热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHPUnit测试double抛出PHPUnit_Framework_MockObject_BadMethodCallException

如何解决《PHPUnit测试double抛出PHPUnit_Framework_MockObject_BadMethodCallException》经验,为你挑选了1个好方法。

我正在尝试创建一个模拟对象,并在测试时在我的Zend框架应用程序中使用它:

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

Gerard Roche.. 5

QA_Auth::isAuthenticated() 是静态方法,静态方法不能被模拟.

限制:final,private和static方法

请注意,无法对最终,私有和静态方法进行存根或模拟.它们被PHPUnit的测试双重功能忽略,并保留其原始行为.

- 测试双打

该手册说测试加倍"保留其原始行为",但静态方法则不然.有一个未解决的问题.另请参阅PHPUnit模拟对象和静态方法.



1> Gerard Roche..:

QA_Auth::isAuthenticated() 是静态方法,静态方法不能被模拟.

限制:final,private和static方法

请注意,无法对最终,私有和静态方法进行存根或模拟.它们被PHPUnit的测试双重功能忽略,并保留其原始行为.

- 测试双打

该手册说测试加倍"保留其原始行为",但静态方法则不然.有一个未解决的问题.另请参阅PHPUnit模拟对象和静态方法.


推荐阅读
author-avatar
WingKeii-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有