【问题标题】:PHPUNIT_Framework_TestCase not found when running single test运行单个测试时找不到 PHPUNIT_Framework_TestCase
【发布时间】:2016-01-27 06:26:02
【问题描述】:

我正在尝试通过 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 扩展而来。

【问题讨论】:

    标签: php laravel phpunit


    【解决方案1】:

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

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

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

    解决方案

    替换

    class TestThatFails extends PHPUNIT_Framework_TestCase
    

    class TestThatFails extends PHPUnit_Framework_TestCase
    

    【讨论】:

    • 啊……很好的答案。在您指出之前,我什至没有意识到大小写的区别。也感谢您的明确解释。现在一切都是绿色的:)
    【解决方案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 中之外,最好的方法是将引导文件作为参数包含在命令中

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

    【讨论】:

    • 您能否详细说明为什么在我运行 phpunit 时会加载类,但在尝试运行特定测试时却没有?
    • 您建议的命令用于运行所有测试。我已经可以成功运行所有测试。出于某种原因,当我尝试挑出一个测试时,该类无法解决。我已经更新了问题以包含我的phpunit.xml 文件,也许那里隐藏了一个解释?
    • @tam 您可以指定要在引导文件之后立即运行的测试。请参阅我的更新答案。
    • 啊,我知道我认为这可能是一个选择,谢谢。麻烦的是,我仍然得到同样的错误! :(
    • @tam bootstrap/autoload.php 的内容是什么?
    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2011-01-03
    相关资源
    最近更新 更多