Laravel测试无法找到供应商类



我使用laravel7和codeception;我有一个Api测试类名为abcCest位于test/api文件夹。

它看起来像这样:

<?php
use TestsTestCase;
class abcCest extends TestCase
{}

父类TestCase的内容如下:

<?php
namespace Tests;
use IlluminateFoundationTestingTestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
}

我一直得到错误:

PHP致命错误:在/var/www/Tests/testcase . PHP第7行中没有找到Trait " TestsCreatesApplication "

正是我使用这个特性的地方。问题是特性CreatesApplication存在于路径下的供应商文件夹中:vendor/laravel/laravel/tests/CreatesApplication.php,这是它的内容:

<?php
namespace Tests;
use IlluminateContractsConsoleKernel;
trait CreatesApplication
{
/**
* Creates the application.
*
* @return IlluminateFoundationApplication
*/
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/"
}
}

我多次运行composer dump- auload,但仍然得到相同的错误…

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

你有两个选择:手动包含文件(老实说,我不知道这将如何完成一个trait)或只是复制的方法从trait到你的基类。


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


虽然进一步考虑这一点,似乎你可能会误解Laravel应用程序是如何设置的。laravel/laravel包不应该包含在你的应用程序中;它是你的应用,或者至少是你的应用的框架。所以你所说的vendor/laravel/laravel/tests目录应该是你的应用的tests目录。

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

最新更新