【发布时间】:2015-07-14 23:21:18
【问题描述】:
类似的问题已经在这里问过好几次了
- PHPUnit loads all classes at once. Causes PHP Fatal error: Cannot redeclare class
- Cannot redeclare class error when generating PHPUnit code coverage report
PHPUnit 触发一个新的致命错误
致命错误:无法在第 6 行的 /some/path/to/Validator.php 中重新声明类 Validator
ValidatorTest 类
class ValidatorTest extends PHPUnit_Framework_TestCase
{
/**
* @dataProvider data_provider_rules
*/
public function test_factory($rules)
{
define('DIR_SEP', DIRECTORY_SEPARATOR);
define('SYS_DIR', '.'.DIR_SEP.'..'.DIR_SEP.'classes'); //relative path here
require SYS_DIR.DIR_SEP.'Validator.php';
$validator = Validator::factory();
return $validator;
}
}
还有Validator 类
class Validator
{
private static $validator = FALSE;
public function __construct()
{
}
public static function factory()
{
if (empty(self::$validator))
{
self::$validator = new Validator();
}
return self::$validator;
}
}
这些类是微不足道的,没有任何自动加载或包含/要求。我从单独的测试目录运行测试,该目录仅包含ValidatorTest.php 和配置文件phpunit.xml(从here 复制)。测试运行良好时
processIsolation="true"
当使用require_once 而不是require 时,这些测试也有效。 所以我的问题是哪个(如果有的话)以及为什么:我是否必须将processIsolation 属性显式设置为true(因为默认为false),使用require_once(不喜欢最好的解决方案)或重构代码(停止使用静态范围、相对路径等)?
【问题讨论】:
-
你不能在你的环境中为 phpunit 使用自动加载系统而不是使用
require? -
@Matteo 我没有使用自动加载(至少在 php 中没有)
-
我建议您尝试编写一个简单的 autoload.php 文件并再次启动测试类。 PHPunit 更喜欢在测试之外自动加载...(需要等)。如果你喜欢我可以试着为你写。告诉我
-
Require_Once() 只会在执行期间加载您的类一次,因此如果它们已经包含,则不会再次包含它们。每次访问时,require 都会加载这些类,这可能会导致您的重复声明。
标签: php unit-testing configuration phpunit