В настоящее время я использую фреймворк lumen (v5.6) и пишу модульные тесты для своего кода.
У меня базовый класс TestCase:
namespace Tests;
$_SERVER["http_proxy"] = "";
abstract class TestCase extends \Laravel\Lumen\Testing\TestCase
{
/**
* Creates the application.
*
* @return \Laravel\Lumen\Application
*/
public function createApplication()
{
return require __DIR__.'/../bootstrap/app.php';
}
}
Я использую этот базовый класс для написания своих тестов, однако у меня есть два теста с большим количеством перекрытий (они оба тестируют реализации интерфейса), поэтому я помещаю общую логику в абстрактный класс:
namespace Tests\App\IO;
use App\io\PageDataParser;
use App\Models\AdvancedArray;
use App\Services\PageService;
use Mockery;
use Tests\TestCase;
abstract class ParsePageDataTestCase extends TestCase
{
// Test logic here, but not relevant for the question
}
И, наконец, я использую этот абстрактный класс в своем собственном тесте:
namespace Tests\App\IO;
use App\io\JsonPageDataParser;
use App\Models\AdvancedArray;
class JsonParsePageDataTestCaseTest extends ParsePageDataTestCase
{
// Test are here, but not relevant for the question
}
Однако, когда я запускаю JsonParsePageDataTestCaseTest, я получаю следующую ошибку:
PHP Fatal error: Class 'Tests\ParsePageDataTestCase' not found in \tests\app\io\JsonParsePageDataTest.php on line 15
Я убедился, что структура папок исправлена, также пробовал использовать composer dump-autoloadand verified that mycomposer.jsonhas an entry which specifies a classmap to 'tests/.
Я выполняю свои тесты с помощью phpunit.xml, который загружает bootstrap/app.php, но все равно получаю эту ошибку.
phpunit.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<phpunit backupGlobals = "false"
backupStaticAttributes = "false"
bootstrap = "bootstrap/app.php"
colors = "true"
convertErrorsToExceptions = "true"
convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true"
processIsolation = "false"
stopOnFailure = "false">
<testsuites>
<testsuite name = "Application test Suite">
<directory suffix = "Test.php">./tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist = "true">
<directory suffix = ".php">./app</directory>
</whitelist>
</filter>
<php>
<!-- ENV variables go here -->
</php>
</phpunit>
И наконец мой composer.json:
{
"name": "laravel/lumen",
"description": "The Laravel Lumen Framework.",
"keywords": ["framework", "laravel", "lumen"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.1.3",
"laravel/lumen-framework": "5.6.*",
"vlucas/phpdotenv": "~2.2",
"willdurand/hateoas": "~2.1",
"guzzlehttp/guzzle": "~6.0",
"ext-json": "*",
"vinelab/neoeloquent": "^1.4.6",
"jenssegers/mongodb": "3.4.*",
"predis/predis": "~1.0"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"phpunit/phpunit": "~7.0",
"mockery/mockery": "~1.0",
"barryvdh/laravel-ide-helper": "~2.5"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/"
]
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
Если вам нужна дополнительная информация, дайте мне знать.
Заранее спасибо!
@GabrielPereira, спасибо за ответ. Но они находятся в одном пространстве имен, поэтому оператор использования не требуется.
Можете ли вы поделиться своей автозагрузкой composer.json?
@GabrielPereira да, обновил вопрос
Вы пытались загрузить свой тестовый класс, помещая их в автозагрузку psr-4 как «Test \\»: «tests /»?
Это помогло @GabrielPereira, спасибо!
@GabrielPereira, не могли бы вы добавить это с объяснением в качестве ответа? Это может помочь другим людям, которые сталкиваются с этой проблемой, поскольку laravel утверждает, что автоматически загружает все по умолчанию (и делает composer.json правильным), но, по-видимому, это не работает без дополнительных действий






Это проблема из-за установки Lumen. Когда вы устанавливаете laravel, папка tests настроена как psr-4 на autoload-dev:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
...
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
...
"minimum-stability": "dev",
"prefer-stable": true
}
Но при установке Lumen этого не происходит, как мы видим ниже:
{
"name": "laravel/lumen",
"description": "The Laravel Lumen Framework.",
"keywords": ["framework", "laravel", "lumen"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.1.3",
"laravel/lumen-framework": "5.7.*",
"vlucas/phpdotenv": "~2.2"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
"phpunit/phpunit": "~7.0",
"mockery/mockery": "~1.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/"
]
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
Итак, чтобы это работало, вам нужно будет изменить автозагрузку на:
"autoload-dev": {
"classmap": [
"tests/"
],
"psr-4": {
"Tests\\": "tests/"
}
}
Отсутствует оператор использования ParsePageDataTestCase после объявления пространства имен в JsonParsePageDataTestCaseTest.php.