PHPUnit 测试错误,找不到类。

3

我刚开始接触PHPUnit和单元测试,于是通过composer安装了PHPUnit和phar。一切进行得很顺利,直到我开始尝试执行我的简单测试时,出现了错误。我使用的是PhpStorm,可以看到所有的类都已自动加载,但当我尝试启动测试时,出现了错误:

Fatal error: Class 'PharIo\Manifest\Simple' not found in C:\xampp\htdocs\mydocs\

我不明白为什么他在比PHPUnit存在的文件夹更高的文件夹中寻找It?

我试图配置composer.json中的autoload部分,并检查phpunit.xml中的设置,但一切都没有用。

添加:

我必须重新安装没有PharIO的PHPUnit,所以现在我有了一点进展,现在我可以通过将require_once行与被测试类的名称配对来测试我的类。它看起来像:

require_once '../src/Simple.php';

class SimpleTest extends PHPUnit_Framework_TestCase
{

    public function testAdd() {

        $sum = new Simple();

        $this->assertEquals(5, $sum->add(2, 3));

    }

}

所以我的简单类是:
class Simple {

public function add($a, $b) {

    return (int) $a + (int) $b;

}

}

当然,我想要使用命名空间。我尝试基于这个问题做出一些改变:Autoloading classes in PHPUnit using Composer and autoload.php(我甚至尝试使用那个存储库进行测试,但仍然存在错误),但是对我来说都没有用。我尝试像这样编辑我的composer.json文件中的自动加载部分:

"autoload": {
    "psr-4": {
        "app\\": "src/"
    }

},

但是仍然存在一个错误,换句话说就是自动加载无法识别它。我已经使用相同的设置创建了phpunit.xml和phpunit.dist.xml文件。

<phpunit
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/3.7/phpunit.xsd"
        backupGlobals="true"
        backupStaticAttributes="false"
        colors="true"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        processIsolation="false"
        stopOnFailure="false"
        syntaxCheck="false"
        bootstrap="./tests/bootstrap.php">

        <testsuites>
                <testsuite name="The project's test suite">
                        <directory>./tests</directory>
                </testsuite>
        </testsuites>
</phpunit>

我也制作了tests/bootstrap.php文件,并且添加了:

require_once '../vendor/autoload.php';

请发布您的配置截图。除此之外,还可以查看:https://confluence.jetbrains.com/display/PhpStorm/Testing+PHP+Applications - LazyOne
你是否有一个 phpunit.xml.dist 文件?如果是,你可以贴出来吗? - motanelu
是的,我已经将它添加到我的帖子中了。 - Nesquik27
3个回答

8

我知道这是一个老问题,但也许您需要执行

composer dump-autoload 以便composer生成类映射。

我浪费了30分钟来理解为什么PHPUnit会提示:

无法存根或模拟类或接口XXX,因为它不存在


2

Composer的自动加载依赖于位于vendor/autoload.php文件中的配置,该文件需要在执行线程的某个时刻加载。您的应用程序已经包含了这个文件,这就是为什么它能够工作,但测试使用不同的入口点,因此您需要使用一个名为phpunit.xml.dist的文件进行配置。

假设您的文件结构类似于:

app/
src/
tests/
  bootstrap.php <- create it in your test folder
vendor/
...
composer.json
composer.lock
phpunit.xml.dist <- create it if does not exist

您可以在此处查看各种选项,但对于基本配置,您可以使用以下内容。

文件phpunit.xml.dist

<phpunit
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/3.7/phpunit.xsd"
    backupGlobals="true"
    backupStaticAttributes="false"
    bootstrap="tests/bootstrap.php">
</phpunit>

文件 tests/bootstrap.php

require_once '../vendor/autoload.php';

你应该从根目录下运行phpunit


1
我尝试按照所有建议的步骤去做,但是自动加载仍然无法工作。为什么我们需要创建bootstrap.php文件?!我们能否将此路径直接添加到xml配置文件中的vendor/autoload.php中?! - Nesquik27

1

您应该指定具有自动加载类的脚本。

您可以按照其他答案中建议的方式在XML文件中指定带有自动加载的文件,或者只需在运行测试的命令中指定--bootstrap选项

phpunit --bootstrap vendor/autoload.php tests


当我尝试执行此命令时,出现了错误:致命错误:调用未定义的方法PHPUnit_Util_Configuration :: getSeleniumBro - Nesquik27

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