我使用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
文件在你的应用程序的测试文件夹。