【问题标题】:Why, Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...?为什么,致命错误:在...中找不到类“PHPUnit_Framework_TestCase”?
【发布时间】:2011-08-29 06:33:51
【问题描述】:

为什么我会收到这个 PHP 错误?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...

【问题讨论】:

  • 您根本没有提供任何信息。
  • 通过 phpunit 命令行运行你的测试。它加载了必要的类。
  • 您还可以使用以下答案stackoverflow.com/questions/42811164/… 中的答案来保持您的代码与 PHPUnit 6 以及早期版本的兼容。

标签: php fatal-error classnotfoundexception


【解决方案1】:

我得到了它的工作

include("vendor/autoload.php");

在我的测试函数的顶部。

【讨论】:

    【解决方案2】:

    我在窗口 10 上使用 php 5.6 和 zend 1.12 版本为我添加

    require_once 'PHPUnit/Autoload.php';

    之前

    抽象类 Zend_Test_PHPUnit_ControllerTestCase 扩展 PHPUnit_Framework_TestCase

    工作。我们需要在 ControllerTestCase.php 文件中添加上述语句

    【讨论】:

      【解决方案3】:

      对我来说,那是因为我跑了

      $ phpunit .
      

      而不是

      $ phpunit
      

      当我已经在工作目录中配置了phpunit.xml 文件时。

      【讨论】:

        【解决方案4】:

        注意: 命令php bin/console generate:doctrine:crud 还会在src/Tests 中创建TestController,因此如果您没有UnitTests,它会在您尝试启动服务器时引发错误。删除文件修复它!

        【讨论】:

          【解决方案5】:

          我使用 ZF2 并在将 'PHPUnit_Framework_TestCase' 替换为 '\PHPUnit\Framework\TestCase' 时为我工作

          【讨论】:

            【解决方案6】:

            对于那些在将 phpunit 更新到 2017 年 2 月 3 日发布的版本 6 或更高版本(例如使用 composer)后到达这里的人,您可能会收到此错误,因为 phpunit 代码现在已命名空间(检查@ 987654321@)。

            您需要将 \PHPUnit_Framework_TestCase 等内容重构为 \PHPUnit\Framework\TestCase

            【讨论】:

            • 谢谢,我遇到了这个问题,因为 Travis CI 在他们的 PHP 7 构建中使用了最新的 PHPUnit 版本。我的解决方法是手动下载旧的 phar 并改用它。
            • github.com/sebastianbergmann/phpunit/wiki/… 它在发行说明的顶部,但我错过了它
            • 谢谢您,好先生。升级到第 6 版后,我确实到了这里。
            • 我的测试突然停止工作让我非常恼火。我做了一个作曲家更新,它把我的 PHPunit 更新到了 6.1。谢谢。
            【解决方案7】:

            对于更高版本的phpunit,例如6.4 您必须使用命名空间 PHPUnit\Framework\TestCase

            使用 TestCase 代替 PHPUnit_Framework_TestCase

            // use the following namespace
            use PHPUnit\Framework\TestCase;
            
            // extend using TestCase instead PHPUnit_Framework_TestCase
            class SampleTest extends TestCase {
            
            }
            

            【讨论】:

            • 这对我很有用,因为我正在学习旧教程
            • 你刚刚复制了 shadi 的答案
            • @Adam 谁是沙迪?
            • 我不知道这样的事情。我得到了同样的错误然后我通过破解包来探索答案
            【解决方案8】:

            我在 PHP5 上运行 PHPUnit 测试,然后,我还需要支持 PHP7。这就是我所做的:

            在 composer.json 中:

            "phpunit/phpunit": "~4.8|~5.7"
            

            在我的 PHPUnit 引导文件中(在我的例子中,/tests/bootstrap.php):

            // PHPUnit 6 introduced a breaking change that
            // removed PHPUnit_Framework_TestCase as a base class,
            // and replaced it with \PHPUnit\Framework\TestCase
            if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Framework\TestCase'))
                class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');
            

            换句话说,这将适用于最初为 PHPUnit 4 或 5 编写的测试,但随后也需要在 PHPUnit 6 上运行。

            【讨论】:

            • 如果您不想接触 Civi\Test 代码但需要与最新的基于命名空间的 php 单元测试兼容,此解决方案很重要
            【解决方案9】:

            很可能您正在运行 WordPress 核心测试,并且最近将您的 PhpUnit 升级到版本 6。如果是这种情况,那么最近对 PhpUnit 命名空间的更改将破坏您的代码。

            幸运的是,https://core.trac.wordpress.org/changeset/40547 的核心测试有一个补丁可以解决这个问题。它还包括对 travis.yml 的更改,您的设置中可能没有这些更改;如果是这种情况,那么您需要编辑 .diff 文件以忽略 Travis 补丁。

            1. https://core.trac.wordpress.org/changeset/40547底部下载“Unified Diff”补丁
            2. 如果您不需要,请编辑补丁文件以删除补丁的 Travis 部分。从文件顶部删除到这一行的正上方:

              Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
              
            3. 将差异保存在 /includes/ 目录上方的目录中 - 在我的情况下,这是 Wordpress 目录本身

            4. 使用 Unix 补丁工具修补文件。您还需要去除前几个斜杠以从绝对目录结构移动到相对目录结构。从上面的第 3 点可以看出,包含目录之前有五个斜杠,-p5 标志将为您删除。

              $ cd [WORDPRESS DIRECTORY]
              $ patch -p5 < changeset_40547.diff 
              

            在我这样做之后,我的测试再次正确运行。

            【讨论】:

              【解决方案10】:

              如果你有 Centos 或其他 Linux 发行版,你必须安装 phpunit 包,我用 yum install phpunit 安装它,它可以工作。也许您必须添加一个存储库,但我认为它必须与默认存储库一起工作(我有 CentOS 7)

              【讨论】:

                【解决方案11】:

                假设:

                Phpunit (3.7) 在控制台环境中可用。

                行动:

                在控制台输入以下命令:

                SHELL> phpunit "{{PATH TO THE FILE}}"
                

                评论:

                您不需要在新版本的 PHPUnit 中包含任何内容,除非您不想在控制台中运行。例如,在浏览器中运行测试。

                【讨论】:

                  【解决方案12】:

                  您可能会收到此错误,因为您对文件进行了命名空间。如果是这样,您需要在 PHPUnit_Framework_TestCase 前面加上一个反斜杠来指定它在全局命名空间中:

                  namespace AcmeInc\MyApplication\Tests
                  class StackTest extends \PHPUnit_Framework_TestCase {}
                  

                  我提交了a crude PR 以开始对话以纠正the documentation

                  【讨论】:

                  • 是的,如果您这样做:class YourNiceTest extends PHPUnit_Framework_TestCase 只需在扩展类前面添加 \,就像在 class YourNiceTest extends \PHPUnit_Framework_TestCase 中一样 - 这对我有用,使用 Symfony 2.8 并包括 phpunit在使用"phpunit/phpunit": "^4.8" 作为本地依赖项下载的作曲家文件中
                  【解决方案13】:

                  您可以简单地安装 PHPUnit 来运行命令 (https://github.com/sebastianbergmann/phpunit/#php-archive-phar):

                  wget https://phar.phpunit.de/phpunit.phar
                  chmod +x phpunit.phar
                  mv phpunit.phar /usr/local/bin/phpunit
                  

                  运行单个测试

                  然后运行 ​​PHPunit 测试:

                  phpunit test.php
                  

                  测试文件内容如下:

                  <?php
                  
                  class StackTest extends PHPUnit_Framework_TestCase
                  {
                      protected function setUp()
                      {
                      }
                  
                      public function testSave()
                      {
                  
                      }
                  }
                  

                  运行测试套件

                  测试套件的配置:demosuite.xml。 demo 是包含所有测试的目录。测试文件必须命名为*_test.php (suffix)。

                  <testsuites>
                      <testsuite name="DemoTestSuite">
                          <directory suffix="test.php">demo</directory>
                      </testsuite>
                  </testsuites>
                  

                  测试套件使用以下命令运行:

                  phpunit -c demosuite.xml --testsuite DemoTestSuite
                  

                  【讨论】:

                  • 这不再有效,因为最新的 PHPUnit 不再支持旧的类名,例如 PHPUnit_Framework_TestCase。你真的必须使用... extends PHPUnit\Framework\TestCase
                  • 只是说我必须先mv phpunit /usr/local/bin/phpunit 然后sudo chmod +x /usr/local/bin/phpunit。在移动之前将文件设置为可执行文件从未在 Vagrant Ubuntu 上运行。不知道为什么......但如果有人为此苦苦挣扎,我希望这会有所帮助。
                  【解决方案14】:

                  PHPUnit documentation以前说的是include/require PHPUnit/Framework.php,如下:

                  require_once ('PHPUnit/Framework/TestCase.php');
                  

                  更新

                  从 PHPUnit 3.5 开始,有一个内置的自动加载器类可以为您处理这个问题:

                  require_once 'PHPUnit/Autoload.php';
                  

                  感谢凤凰指出这一点!

                  【讨论】:

                  • PHPUnit 3.5 带有自己的自动加载器,这可能有助于保持简单:require_once 'PHPUnit/Autoload.php'
                  • 我同意 require_once('PHPUnit/Autoload.php') 是最佳实践。
                  • 我没有PHPUnit/Autoload.phpPHPUnit/Framework/TestCase.php,我的文件夹有点像PHPUnit/Framework/MockObject
                  • 现在我有PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
                  • 查看@shadi 对 PHP 6+ 的回答 stackoverflow.com/a/42561590/2883328
                  猜你喜欢
                  • 2014-03-13
                  • 2019-09-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-10-14
                  • 2014-06-11
                  • 1970-01-01
                  • 2014-06-14
                  • 2017-08-06
                  相关资源
                  最近更新 更多