无法测试php,所有测试均因PHP致命错误而失败:无法重新声明类

我在使用PHPUnit时遇到了奇怪的行为,无法确定我做错了什么还是测试框架中的错误.这是我的情况:

我的项目有几个类:BsInput,BsEmail,BsHidden,BsNumber. BsEmail,BsHidden和BsNumber扩展了BsInput.所有类都具有单元测试类(用于BsInput的BsInputTest,用于BsEmail的BsEmailTest等).

单独执行的每个单元测试都可以.

现在,如果我尝试在项目中运行所有测试,则会收到错误和消息“ PHP致命错误:无法在第80行的/some/path/to/B.php中重新声明B类”.

这是每个文件的内容:

BsInput.php

require_once __DIR__ . "/BsInputControl.php";

class BsInput extends BsInputControl {

...

}

BsEmail.php

require_once __DIR__ . "/BsInput.php";

class BsEmail extends BsInput {

...

}

BsHidden.php

require_once __DIR__ . "/BsInput.php";

class BsHidden extends BsInput {

...

}

BsNumber.php

require_once __DIR__ . "/BsInput.php";

class BsNumber extends BsInput {

...

}

BsInputTest.php

require_once "../colibri/bs/BsInput.php";

class BsInputTest extends PHPUnit_Framework_TestCase {

...

}

BsEmailTest.php

require_once "../colibri/bs/BsEmail.php";

class BsEmailTest extends PHPUnit_Framework_TestCase {

...

}

BsHiddenTest.php

require_once "../colibri/bs/BsHidden.php";

class BsHiddenTest extends PHPUnit_Framework_TestCase {

...

}

BsNumberTest.php

require_once "../colibri/bs/BsNumber.php";

class BsNumberTest extends PHPUnit_Framework_TestCase {

...

}

现在,让我发疯的最后一件事是:如果我注释掉BsHidden.php和BsHiddenTest.php中的所有代码,则PHPUnit All Tests的执行在BsNumber和以下类上都可以顺利进行!

有没有人看过类似的东西?有什么线索可以帮助我解决问题?

我尝试了一个丑陋的解决方法:在BsInput.php中插入以下代码

var_dump(class_exists('BsInput', FALSE));

if (class_exists('BsInput', FALSE)) { return; }

我得到这个结果:

bool(true)

PHP Fatal error: Cannot redeclare class BsInput in /.../BsInput.php on line 87

到目前为止,我已经研究了许多问题,包括上述问题,但到目前为止,我还没有找到任何解决方案.

我还尝试将PHPUnit更新到最新版本(4.6),但没有成功.

我的平台是:

Mac OS X 10.10

PHP 5.5.20

PHPUnit 4.6.6

Netbeans 8.0.2(如果有任何相关内容)

有任何线索吗?

在尝试解决此问题后,我终于删除了我的BsHidden.php文件,附加的测试文件并完全重新创建了它们(我的意思是我复制/粘贴的内容完全相同)…现在可以正常工作了!这确实让我想到了PHP和PHPUnit之间的某个错误.

但是很快肮脏的解决方法似乎是:

>将文件和单元测试文件的内容复制粘贴到另一个文件

>删除有问题的文件和单元测试文件(如果有)

>重新创建文件和单元测试文件并粘贴内容

解决方法:

我终于确定了我的问题.似乎至少在我的平台上存在PHP错误.

PHP的手册说(http://php.net/manual/en/function.include-once.php),在不区分大小写的系统上,PHP4中的名称解析不区分大小写,而PHP5处理此类问题.

这是我在平台(Mac OS X 10.10,PHP 5.5)上得到的行为:

假设我有一个文件A.php,它定义了一个A类和以下代码:

require_once 'A.php';

require_once 'a.php';

?>

第二个require_once触发“无法重新声明类错误”.因此,在Mac OS X上的PHP5.5中,至少名称解析不区分大小写,但是PHP仍然认为它们是不同的文件.

标签:phpunit,php

来源: https://codeday.me/bug/20191120/2042711.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值