当我运行PHPUnit时,它会尝试在意料之外的位置运行测试文件,即Twig安装目录,并且尝试过多次加载Twig类文件。有人知道如何解决这些问题吗?
背景
我在一个Web应用程序中使用Twig(只是Twig,而不是Symfony),通过Composer安装Twig。 Composer和Twig安装在自定义位置,我的测试位于/test/
,因此我有以下简化的项目结构:
/src/includes/vendor/
autoload.php
composer/
twig/
twig/
lib/
test/
/test/
bootstrap.php
(various files named, e.g., someClassTest.php)
我的引导文件(
/test/bootstrap.php
)除了加载Composer自动加载器之外什么都不做:<?php
require_once dirname(__FILE__) . "/../src/includes/vendor/autoload.php";
我的PHPUnit配置文件(phpunit.xml)如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true">
<testsuites>
<testsuite name="All Tests">
<directory>./test/phpunit/</directory>
</testsuite>
</testsuites>
<php>
<ini name="xdebug.default_enable" value="0" />
<ini name="xdebug.remote_autostart" value="0" />
<ini name="xdebug.remote_enable" value="0" />
<ini name="xdebug.overload_var_dump" value="0" />
<ini name="xdebug.show_mem_delta" value="0" />
</php>
</phpunit>
问题
1. PHPUnit正在运行Twig单元测试,位于/src/includes/vendor/composer/twig/twig/test/
。
为什么?根据我的配置文件,我只希望运行/test
中的测试。目前,我创建了一个单独的配置文件,明确排除Twig测试,包含以下条目:
<exclude>./src/includes/vendor/</exclude>
这种做法感觉很粗糙而且脆弱,我不明白为什么需要这样做。有人能解释一下吗?
2. 如果我尝试在没有显式排除Twig单元测试的情况下运行PHPUnit,就会遇到自动加载程序问题。
如果我运行PHPUnit而不包括我的bootstrap.php文件,则Composer自动加载程序未加载,因此PHPUnit在尝试实例化任何Twig类时会失败。
如果我包括自动加载程序,类会被加载两次,并出现以下错误:
Fatal error: Cannot redeclare class Twig_Node_Expression_Test in [path to project]\src\includes\vendor\twig\twig\lib\Twig\Node\Expression\Test.php on line 32
Call Stack:
0.1630 223296 1. {main}() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:0
0.4280 857528 2. IDE_Base_PHPUnit_TextUI_Command::main() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:552
0.4280 864000 3. PHPUnit_TextUI_Command->run() C:\Users\Ed\AppData\Local\Temp\ide-phpunit.php:294
1.8451 1338552 4. PHPUnit_Runner_BaseTestRunner->getTest() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/TextUI/Command.php:150
107.4751 1501304 5. PHPUnit_Framework_TestSuite->addTestFiles() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Runner/BaseTestRunner.php:96
107.6552 1668912 6. PHPUnit_Framework_TestSuite->addTestFile() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Framework/TestSuite.php:416
107.6572 1668888 7. PHPUnit_Util_Fileloader::checkAndLoad() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Framework/TestSuite.php:355
107.6592 1669056 8. PHPUnit_Util_Fileloader::load() phar://C:/Users/Ed/Documents/Programming/phpunit-lts.phar/phpunit/Util/Fileloader.php:76
实际上,我在运行应用程序时没有遇到任何类似的问题;这只发生在单元测试时。
如果有帮助的话,我正在运行PHPStorm 9(PS-141.1717),使用PHPUnit 3.7.37。
有人对这个问题有深入了解吗?
根据评论编辑: PHPStorm 执行的命令行如下:
C:\xampp\php\php.exe C:/Users/Ed/AppData/Local/Temp/ide-phpunit.php --bootstrap [项目路径]\test\phpunit\bootstrap.php --configuration [项目路径]\phpunit.xml [项目路径]