PHP致命错误:找不到类 - PHPUnit。

31

我正在尝试在PHP项目中使用PHPUnit。以下是我的项目结构(文件为斜体字体):

  • 控制器

    • Pages.php
  • 测试

    • pagesTest.php
  • 供应商

    • bin
      • phpunit.bat
  • composer.json

我的文件:

composer.json

{
    "require-dev": {
        "phpunit/phpunit":"5.5.4"
    }
}

页面.php

<?php
namespace controllers

class Pages
{
    public function render()
    {
        return 'Hello World';
    }

}

测试页面.php

<?php

class PagesTest extends PHPUnit_Framework_TestCase
{
    public function testRenderReturnsHelloWorld()
    {
        $pages = new \controllers\Pages();
        $expected = 'Hello Word';
        $this->assertEquals($expected, $pages->render());
    }
}

当我打开命令行时,我输入:

C:\xampp\htdocs\PHPUnitTestProject\vendor\bin>phpunit ../../tests/PagesTest.php

我收到了这个错误信息:PHP致命错误:在C:\xampp\htdocs\PHPUnitTestProject\tests\pagesTest.php的第7行未找到类'controllers\Pages'

这是一个路径问题。我认为是因为它搜索不存在的C:\xampp\htdocs\PHPUnitTestProject\vendor\bin\controllers\Pages()
应该是C:\xampp\htdocs\PHPUnitTestProject\controllers\Pages()


1
这是离题了,但请确保使用符合PSR-4标准的文件名。使用PageTest.php而不是pageTest.php - BVengerov
5个回答

47

你需要指向被测试的类,因此在pagesTest.php中添加一个require:

require __DIR__ . "/../controllers/Pages.php";

或者,如果您正在使用自动加载,则可以在命令行中引导自动加载

phpunit --bootstrap src/autoload.php

或者,您可以像上面我提供的PHPUnit页面示例一样设置一个phpunit.xml配置文件:

<phpunit bootstrap="src/autoload.php">
  <testsuites>
    <testsuite name="money">
      <directory>tests</directory>
    </testsuite>
  </testsuites>
</phpunit>

然后您可以将其与--configuration选项一起使用。


3
如果我已经完成了以上所有步骤,但仍然出现错误怎么办? - Antony D'Andrea
5
@AntonyD'Andrea 一些额外尝试的事情...对于需要的部分,很可能是路径问题,请打印出__DIR__ 路径以确保它与您想的一样,如果您正在使用Composer,可以运行 composer dumpautoload,或者如果它似乎卡住了,您可以删除vendor文件并运行 composer update 作为绝望的措施,但这也会更新依赖项。祝你好运! - Katie
2
谢谢,结果是跟 PHPUnit 6.0 有关系,我把它在 5.7 上工作了(我正在处理别人的库)。 - Antony D'Andrea

4
尝试使用 composer dump-autoload -o 命令。

我从谷歌来到这里,明确地安装了PHPUnit而没有使用Composer。 - clockw0rk
对我来说,甚至composer dumpautoload都像被接受的答案的评论所建议的那样运作。 - joeljpa

4
phpunit.xml.dist中添加bootstrap="vendor/autoload.php"解决了我的问题。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"> <!-- in here -->
    <php>
        <!-- ... -->
    </php>
    <testsuites>
       <!-- ... -->
    </testsuites>
</phpunit>

2

从根目录调用phpunit

$ cd C:\xampp\htdocs\PHPUnitTestProject\
$ vendor\bin\phpunit tests/PagesTest.php

0

我遇到了同样的错误,因为我没有将我的类名与phpunit调用的文件名相同。

例如,我在调用:

phpunit TEST_myweb_controller.php

但我的类定义是:class web_controller_test extends PHPUnit\Framework\TestCase

这样就会返回一个错误:Class 'TEST_myweb_controller.php' could not be found in '\my\path\to\tests\TEST_myweb_controller.php'

为了解决这个问题,我将类定义更改为:class TEST_myweb_controller extends PHPUnit\Framework\TestCase


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