找不到作曲家phpunit psr-4自动加载类

Posted

技术标签:

【中文标题】找不到作曲家phpunit psr-4自动加载类【英文标题】:composer phpunit psr-4 autoload class not found 【发布时间】:2017-01-02 10:27:48 【问题描述】:

我正在尝试使用一些 phpunit 测试类作曲家自动加载,但我似乎无法让它工作。当我从命令行运行 phpunit 时,出现以下错误:“PHP Fatal Error: Class ... not found”。

我会给出所有的结构和文件信息。 我可以,所以希望有人能发现我哪里出错了。

结构(缩减为相关文件):

composer.json
composer.lock
phpunit.xml
vendor/
tests/
    functional/
        BaseTestCase.php
        HomepageTest.php

composer.json


"require": 
    "php": ">=5.5.0",
    "slim/slim": "^3.1",
    "slim/php-view": "^2.0",
    "monolog/monolog": "^1.17"
,
"require-dev": 
    "phpunit/phpunit": ">=4.8 < 6.0"
,
"autoload-dev": 
    "psr-4": 
        "Tests\\": "tests/"
    


phpunit.xml

<?xml version="1.0" encoding="utf-8" ?>
<phpunit colors="true" bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="Initial tests">
            <directory>tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

测试/功能/BaseTestCase.php

<?php
namespace Tests\Functional;

use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;
use Slim\Http\Environment;

class BaseTestCase extends \PHPUnit_Framework_TestCase

  ...

测试/功能/HomepageTest.php

<?php
namespace Tests\Functional;

class HomepageTest extends BaseTestCase

   ...

然后我运行更新以刷新自动加载文件

$ composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files

然后我尝试运行 phpunit 并得到一个类未找到错误:

$ vendor/bin/phpunit

PHP Fatal error:  Class 'Tests\Functional\BaseTestCase' not found in <project-root>/tests/functional/HomepageTest.php on line 6

为了彻底起见,我尝试以另一种方式刷新自动加载文件,以防万一:

$ composer dump-autoload

Generating autoload files
sfbagency@sfb1:~/clients/ctest/dev$ 

我还检查了 vendor/composer/autoload_psr4.php 以确保正在设置测试引用,并且确实如此。

...
Tests\\' => array($baseDir . '/tests'),
...

我在 Google 上发疯了,但不知道我哪里出错了。

【问题讨论】:

尝试将目录名称“functional”更改为“Functional”。 【参考方案1】:

命名空间目录区分大小写。您必须将文件夹重命名为Functional

如PSR-4 documentation中所说:

子目录名称必须与子命名空间名称的大小写匹配。

【讨论】:

愚蠢的错误 :( 太明显了。只见树木不见森林。我想我将不得不让这个问题成为愚蠢的纪念碑。谢谢!【参考方案2】:

我有类似的问题,但没有语法问题。 一旦我添加了第二个 ClassTest(下面的ModelTwoTest.php),Fixtures.php 类就会自动加载。如果我删除了 1 个 modelTest,则只有剩余的 ModelTest 会自动加载而没有 Fixtures。奇怪的行为。

src/
tests/
      Models/
             ModelOneTest.php
             ModelTwoTest.php <---
      Fixtures/
             Fixtures.php

【讨论】:

以上是关于找不到作曲家phpunit psr-4自动加载类的主要内容,如果未能解决你的问题,请参考以下文章

psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合

PSR-4 自动加载器致命错误:找不到类

作曲家 psr-4 使用相同的键自动加载

作曲家更新错误不符合 psr-4 自动加载标准。跳过

Laravel psr-4 不自动加载

PHPUnit 自动加载器错误:找不到类“Yii”