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
目录。
我正在使用 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
目录。