Тестовый класс не найден при расширении абстрактного тестового класса

В настоящее время я использую фреймворк 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
}

Если вам нужна дополнительная информация, дайте мне знать.

Заранее спасибо!

Отсутствует оператор использования ParsePageDataTestCase после объявления пространства имен в JsonParsePageDataTestCaseTest.php.

Gabriel Pereira 26.10.2018 10:05

@GabrielPereira, спасибо за ответ. Но они находятся в одном пространстве имен, поэтому оператор использования не требуется.

Sven Hakvoort 26.10.2018 10:06

Можете ли вы поделиться своей автозагрузкой composer.json?

Gabriel Pereira 26.10.2018 10:07

@GabrielPereira да, обновил вопрос

Sven Hakvoort 26.10.2018 10:08

Вы пытались загрузить свой тестовый класс, помещая их в автозагрузку psr-4 как «Test \\»: «tests /»?

Gabriel Pereira 26.10.2018 10:11

Это помогло @GabrielPereira, спасибо!

Sven Hakvoort 26.10.2018 10:13

@GabrielPereira, не могли бы вы добавить это с объяснением в качестве ответа? Это может помочь другим людям, которые сталкиваются с этой проблемой, поскольку laravel утверждает, что автоматически загружает все по умолчанию (и делает composer.json правильным), но, по-видимому, это не работает без дополнительных действий

Sven Hakvoort 26.10.2018 12:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
863
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это проблема из-за установки 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/"
    }
}

Другие вопросы по теме