跟踪PHPUnit模拟对象创建

跟踪PHPUnit模拟对象创建,php,unit-testing,doctrine-orm,phpunit,Php,Unit Testing,Doctrine Orm,Phpunit,我在ZF2+Doctrine2项目中遇到PHPUnit测试失败: RuntimeException: Method "findAllByState" could not be found in repository "Mock_EntityRepository_4af853d8" 我正在使用以下方法创建模拟存储库: $repository = $this ->getMockBuilder('Doctrine\ORM\EntityRepository') -

我在ZF2+Doctrine2项目中遇到PHPUnit测试失败:

RuntimeException: Method "findAllByState" could not be found in repository "Mock_EntityRepository_4af853d8"
我正在使用以下方法创建模拟存储库:

$repository = $this
        ->getMockBuilder('Doctrine\ORM\EntityRepository')
        ->disableOriginalConstructor()
        ->getMock();
$repository
       ->method('findAllByState')
       ->willReturn([]);

但这显然是不正确的。因此,我如何跟踪PHPUnit mock对象的创建,以找出创建
mock\u EntityRepository\u blah
的位置,这样我就可以告诉它关于
findAllByState()

您需要
->setMethods(array('findAllByState'))
应用于mock builder。稍晚一点,在表9之后。1@xmike,谢谢,但该测试仍然会出错(不确定原因,请参见下一步),并且还会创建一个
PHP致命错误:在第179行的vendor/doctor/orm/lib/doctor/orm/EntityRepository.PHP的null上调用成员函数getUnitOfWork(),终止PHPUnit,防止进一步的输出。@xmike,啊,因为
setMethods()
会覆盖任何默认值,所以我需要告诉它
findBy
findAll
。谢谢-这确实解决了我的问题。但我仍然对我提出的问题感到好奇。@xmike,你想让我把我的问题作为一个问题发布,这样你就可以回答绿色的问题了吗?我从来没有尝试过以相关的深度和注意力来看待模拟生成,但概括地说,PHPUnit分析实际的类实现,从
getMockBuilder
中添加您的配置(或者在模拟不存在的类时仅使用您的配置),然后生成实现行为和间谍功能的相关代码,然后
eval
对其进行评估并为您实例化。您可能需要检查详细信息。