为什么,致命错误:在......中找不到类'PHPUnit_Framework_TestCase'?

时间:2011-05-19 22:53:16

标签: php fatal-error classnotfoundexception

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

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

15 个答案:

答案 0 :(得分:201)

对于那些在将phpunit更新为在2017-02-03上发布的版本6或更高版本后到达此处的人(例如使用作曲家),您可能会收到此错误,因为phpunit代码现在已命名为namespace(check { {3}})。

您需要将\PHPUnit_Framework_TestCase之类的内容重构为\PHPUnit\Framework\TestCase

答案 1 :(得分:69)

PHPUnit documentation 表示用来表示包含/需要PHPUnit / Framework.php,如下所示:

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

<强>更新

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

require_once 'PHPUnit/Autoload.php';

感谢凤凰城指出这一点!

答案 2 :(得分:27)

对于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 {

}

答案 3 :(得分:13)

您可能会因为命名文件而收到此错误。如果是这样,您需要通过在其前面加上反斜杠来指定PHPUnit_Framework_TestCase在全局命名空间中:

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

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

答案 4 :(得分:9)

我在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上工作。

答案 5 :(得分:5)

您只需安装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 test:

phpunit test.php

测试文件的内容如下:

<?php

class StackTest extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testSave()
    {

    }
}

运行测试套件

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

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

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

phpunit -c demosuite.xml --testsuite DemoTestSuite

答案 6 :(得分:4)

假设:

  

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

<强>动作:

在控制台中输入以下命令:

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

<强>注释:

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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

  1. 下载&#34;统一差异&#34;来自https://core.trac.wordpress.org/changeset/40547
  2. 底部的补丁
  3. 如果您不需要,请编辑补丁文件以删除补丁的Travis部分。从文件顶部删除到此行的上方:

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

  5. 使用Unix补丁工具修补文件。您还需要剥离前几个斜杠以从绝对目录结构移动到相对目录结构。从上面的第3点可以看出,include目录之前有5个斜杠,-p5标志将为你摆脱。

    $ cd [WORDPRESS DIRECTORY]
    $ patch -p5 < changeset_40547.diff 
    
  6. 我这样做后,我的测试再次正确运行。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

注意::命令php bin/console generate:doctrine:crud还在TestController中创建src/Tests,因此如果您没有{{ 1}}。删除文件吧!

答案 11 :(得分:0)

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

$ phpunit .

代替

$ phpunit

在工作目录中已经有一个已配置的phpunit.xml文件时。

答案 12 :(得分:0)

我正在使用带有zend 1.12版本的窗口10上的php 5.6为我添加

  

require_once'PHPUnit / Autoload.php';

之前

  

抽象类Zend_Test_PHPUnit_ControllerTestCase扩展   PHPUnit_Framework_TestCase

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

答案 13 :(得分:0)

我得到了它

include("vendor/autoload.php");

在我的测试函数的顶部。

答案 14 :(得分:-1)




又矮又甜;这对我有用:

PHP ping 函数

function ping($host){
    $start=microtime(true);
    $fp=@fsockopen($host, 80, $errno, $errstr, 10);
    return (!$fp?'(Unknown)': round((microtime(true)-$start)*1000));
}

用法:

ping('google.com');