PHPUnit中使用Twig进行单元测试

4

当我运行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 [项目路径]


你使用的运行测试的命令是什么? - Alain Tiemblo
@AlainTiemblo 请查看我的编辑。 - elixenide
2个回答

0
我通过对PHPStorm进行了一番调试,找到了答案。在“运行/调试配置”对话框中,我将“目录”选项作为“测试范围”进行了勾选。我将其更改为“在配置文件中定义”。

Screenshot of PHPStorm Run/Debug Configuration dialog

目前,PHPUnit只在/test/phpunit/中运行测试,如我的phpunit.xml所指定的。这意味着它不会运行Twig测试(如预期),从而消除了我问题中指定的两个问题。如果我从PHPStorm中运行测试,或者在包含phpunit.xml的目录中简单地执行命令phpunit,则可以正常工作。

话虽如此,如果有人知道如何同时运行我的测试和Twig测试而不会出现“无法重新声明类”的错误,请发表评论。


0
在你的PHPUnit命令结尾处,尝试将[path to project]替换为[path to project]/tests/phpunit,或者完全省略该部分。

该命令是由PHPStorm自动生成并执行的,我无法直接控制它。 - elixenide
很抱歉,出错的是那个命令。PHPUnit正在搜索整个目录结构,包括您的第三方依赖项,以查找\PHPUnit_Framework_TestCase的扩展。将其路径指定为您的测试,或者不指定任何内容,因此它使用您在phpunit.xml文件中定义的路径即可解决问题。如果您的IDE无法处理,请尝试在终端中运行phpunit命令。 - Sam Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接