运行单个测试时找不到PHPUNIT_Framework_TestCase

时间:2016-01-25 21:24:37

标签: php laravel phpunit

我正在尝试使用 Laravel 5.2.10 进行PHPUnit测试。我在项目中本地安装了 PHPUnit 5.1.4

当我跑步时:

phpunit

PHPUnit完美地运行我test目录中的所有测试。

然而,当我跑步时:

phpunit tests/unit/testThatFails.php

我明白了:

PHP Fatal error:  Class 'PHPUNIT_Framework_TestCase' not found in ...

奇怪的是,当我运行phpunit时,它会成功运行测试目录中的每个测试,包括这个testThatFails.php就好了。

当我尝试只运行一次测试时为什么会中断?

更新
这是我的phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory>./tests/</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory suffix=".php">app/</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>

更新
目前,由于我使用的是Laravel,我通过扩展TestCase而不是PHPUNIT_Framework_TestCase 绕过这个问题,我的测试能够按预期运行。但是,这只是规避而非解决方案。 (我也很奇怪,鉴于TestCase本身最终从PHPUNIT_Framework_TestCase扩展而来,这是有效的。

2 个答案:

答案 0 :(得分:9)

消息显示PHPUNIT_Framework_TestCase,但该类实际上称为PHPUnit_Framework_TestCase。现在这是棘手的事情

  • PHP中的类名称不区分大小写,这就是为什么当您运行整个测试套件并且类已经加载时它的工作原理。的 BUT
  • 自动加载器区分大小写,因为您的文件系统区分大小写,无法猜出正确的大小写。

因此,当您单独运行测试时,在包含测试用例文件之前未加载类PHPUNIT_Framework_TestCase,并且自动加载器将查找文件PHPUNIT/Framework/TestCase.php而不是PHPUnit/Framework/TestCase.php。此文件不存在,您收到未找到的&#34;类&#34;错误。

解决方案

替换

class TestThatFails extends PHPUNIT_Framework_TestCase

class TestThatFails extends PHPUnit_Framework_TestCase

答案 1 :(得分:2)

PHPUnit加载实际保存有关引导文件信息的配置文件phpunit.xml(参见here

...
bootstrap="tests/bootstrap.php"
...

bootstrap.php加载autoloader,从而使您的应用中的所有课程都可用。

require __DIR__.'/../vendor/autoload.php';

可能autoload.php未包含在testThatFails.php中。 autoload php加载PHPUNIT_Framework_TestCase以及可能与此案例相关的其他文件/类(其他一些单元测试类等)。恕我直言,除了在phpunit.xml中包含它之外,最好的方法是将bootstrap文件作为参数包含在命令中

phpunit --bootstrap bootstrap/autoload.php testThatFails.php