PHPUnit测试套件-无法重新声明类模拟&;具体类别

PHPUnit测试套件-无法重新声明类模拟&;具体类别,php,phpunit,Php,Phpunit,这是我的问题 我有一个测试套件,正在测试几个类。我的类都使用依赖注入 我有一个名为scheduleHandler的类,它通过了所有测试。然后,我的另一个类ruleHandler有一个需要scheduleHandler实例的方法。我不想传入真正的ScheduleMandler,所以我尝试创建一个模拟ScheduleMandler来注入 我遇到的问题是,由于scheduleHandler类是在ruleHandler上面的套件中测试的,因此在创建模拟时,我得到:- PHP Fatal error:

这是我的问题

我有一个测试套件,正在测试几个类。我的类都使用依赖注入

我有一个名为scheduleHandler的类,它通过了所有测试。然后,我的另一个类ruleHandler有一个需要scheduleHandler实例的方法。我不想传入真正的ScheduleMandler,所以我尝试创建一个模拟ScheduleMandler来注入

我遇到的问题是,由于scheduleHandler类是在ruleHandler上面的套件中测试的,因此在创建模拟时,我得到:-

PHP Fatal error:  Cannot redeclare class scheduleHandler
如果我不使用测试套件,单独运行测试,一切都很好

有人知道解决这个问题的方法吗?

试试
$this->getMock('scheduleHandler',array(),array(),'',false)
。这将导致PHPUnit跳过调用scheduleHandler::u construct,这可能是由于加载了两次类而导致的错误。

到目前为止,我的最佳猜测是:

var_dump(class_exists('scheduleHandler', false)); 
为您返回
false
。这意味着这个类还不存在。现在,如果您在phpunit试图扩展类时,autoloader没有找到该类,phpunit将创建它自己的类

如果你以后在某个地方需要真正的类,那么这些类将发生冲突


要测试这一点,请确保在创建模拟对象之前需要真正的
scheduleHandler
类。

尝试在模拟创建中使用名称空间。如果您在项目代码中不使用它们,那么希望它会覆盖全局名称空间,而不会引起冲突


$this->getMock('\SomeTestingFramework\SomeTestClass\scheduleHandler')

$mockScheduler=$this->getMock('scheduleHandler');如果我更改测试套件中的顺序,它就会工作:$this->addTestSuite('scheduleHandlerTest')$此->addTestSuite('ruleHandlerTest');非常奇怪……你能放一个var_转储(class_exists('scheduleHandler',false));在$this->getMock调用之前,请?看看我的假设是否有什么可取之处,你可以确认
var_dump(get_class($this->getMock('scheduleHandler'))
给你一些类似于
scheduleHandler测试的东西。
@Mike B:Yeap我确实得到了这个结果:-object(Mock_scheduleHandler_47ab6dd0)#208(3){[“invocationMocker:protected”]=>NULL[“\u observer:private”]=>数组(0){}[“\u db:private”]=>NULL}Nope,没有区别。PHP致命错误:无法在/var/www/fleetManagement/models/scheduleHandler.class.PHP中重新声明类scheduleHandler您是否可以放置类似于
echo';死亡在getMock调用之后,查看该行是否导致了致命错误,或者它是否在以后发生?上面的内容没有得到响应,致命错误首先发生。这很奇怪-当第五个参数设置为false时,
getMock()
不应该调用代码中的任何内容,因此它应该不会导致致命错误。可能您使用的是一个非常旧的PHPUnit版本,它没有该选项-您可以检查
PHPUnit--version
?您也可以尝试调用
$this->getMock('scheduleHandler',array(),array(),'',false,false,false)
来禁用自动加载和调用
\u clone
-这两种方法在这里都不相关,但值得一试。谢谢。我试过了,结果还是一样。以下是Sebastian Bergmann的版本输出:-PHPUnit 3.5.15。是的,如前所述,它确实适用于测试套件中位于ruleHandler(具有模拟)之上的实际ScheduleMandler。我没有在这些测试中使用自动加载器。这一切都很有效,但我不喜欢如果顺序改变,它会怎么坏。干杯!我的建议是,在创建模拟之前,要求_完成一次真正的类据我所知,几乎没有什么可以避免这种行为。是的,这就是我所能做的。当我有更多的时间时,我将重新讨论这个问题,并尝试找出导致重新声明的原因。谢谢大家的意见!重新声明的原因与edorian所说的一模一样:在通知PHPUnit声明类本身之后(通过在类存在之前调用
getMock()
),您将手动包含类的模块。自动加载器会帮你省去很多精力和头痛,不使用它简直是愚蠢至极。:)