Laravel 测试无法找到供应商 class

Laravel test unable to find vendor class

我正在使用 laravel7 和密码;我在 test/api 文件夹中有一个名为 abcCest 的 Api 测试 class。

看起来像这样:

<?php

use Tests\TestCase;

class abcCest extends TestCase
{}

父级 class TestCase 具有以下内容:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}

我一直收到错误消息:

PHP Fatal error: Trait 'Tests\CreatesApplication' not found in /var/www/tests/TestCase.php on line 7

这是我使用该特征的确切位置。问题是特征 CreatesApplication 存在于路径下的供应商文件夹中:vendor/laravel/laravel/tests/CreatesApplication.php 这是它的内容:

<?php

namespace Tests;

use Illuminate\Contracts\Console\Kernel;

trait CreatesApplication
{
    /**
     * Creates the application.
     *
     * @return \Illuminate\Foundation\Application
     */
    public function createApplication()
    {
        $app = require __DIR__.'/../bootstrap/app.php';

        $app->make(Kernel::class)->bootstrap();

        return $app;
    }
}

在我的 composer.json 文件中,我已经设置了以下内容:

"autoload": {
    "psr-4": {
      "App\": "app/",
      "Tests\": "tests/"
    },
    "classmap": [
      "database/",
      "library/"
    ]
  },
  "autoload-dev": {
    "psr-4": {
      "Tests\": "tests/"
    }
  }

i 运行 composer dump-autoload 多次,但仍然出现相同的错误...

你的测试中应该有一个命名空间声明class。 此外,您的应用程序的测试文件夹中应该有 CreatesApplication.php 文件。

您看到的问题是名称空间与 Composer 的自动加载认为的位置不匹配。根据 PSR-4 规范,您不能在多个目录中使用相同的命名空间,因此无法自动加载文件。

您有两个选择:手动包含文件(老实说,我不知道如何为特征完成此操作)或者只是将特征中的方法复制到您的基础中 class.


真正的问题是你完全包含了这个特征。它自动成为您扩展的基础 Laravel TestCase class 的一部分。您已经可以通过在测试方法中调用 $this->createApplication() 来使用它。


虽然进一步考虑这个问题,但您似乎误解了 Laravel 应用程序的设置方式。 laravel/laravel 包不应该包含在您的应用中;它 您的应用程序,或者至少是将成为您的应用程序的框架。所以你所说的 vendor/laravel/laravel/tests 目录应该是你的应用程序的 tests 目录。