Черта не найдена в блочных тестах Laravel 5

Я пишу некоторые модульные тесты для проверки конечных точек API в моем приложении Laravel 5, и многие конечные точки требуют аутентификации пользователя. Вместо того, чтобы иметь один и тот же код создания учетной записи пользователя в каждом тесте, я хотел бы определить черту RegistersUsers для использования в тестовых классах, которая будет иметь метод registerUser().

Структура каталога моего каталога tests выглядит так:

/tests
    /Traits
        RegistersUsers.php
    TestCase.php
    UserTest.php

У меня есть имена с именами TestCase.php и UserTest.php, добавив это объявление пространства имен:

namespace MyappTests;

и у меня есть namespaced RegistersUsers.php следующим образом:

namespace MyappTests\Traits;

My UserTest выглядит так: с пространством имен и use, чтобы я мог использовать RegistersUsers.

<?php

namespace MyappTests;

use MyappTests\Traits\RegistersUsers;

class UserTest extends TestCase
{
    use RegistersUsers;

    // ... rest of the class

Однако, когда я запускаю тест, PHPUnit умирает с фатальной ошибкой:

Trait 'MyappTests\Traits\RegistersUsers' не найден в /home/vagrant/demo -app-net/tests/UserTest.php в строке 9

Насколько я могу судить, мое пространство имен правильное, и моя черта должна быть найдена. Я собираюсь по кругу с этим и, похоже, не понимаю.

Ответ 1

Я предполагаю наличие признаков в папке с чертами, эта черта больше не учитывается в вашем автозагрузчике.

Чтобы исправить это, вы должны открыть composer.json, найти раздел для autoload-dev и изменить его на что-то вроде следующего...

"autoload-dev": {
    "classmap": [
        "tests/TestCase.php",
        "tests/Traits/"
    ]
},

И это должно добавить любые черты, которые у вас есть в этой папке, к автозагрузчику.

Изменить

В комментариях были подняты некоторые дополнительные идеи. Если вы собираетесь поддерживать правильную структуру пространства имен/пространств имен, было бы неплохо использовать автозагрузку psr-4, а не поддерживать карту классов.

"autoload-dev": {
    "psr-4": {
        "MyappTests\\": "tests/"
    }
},

Кроме того, вместо того, чтобы помещать логику в признак регистрации пользователя для использования с тестированием, при расширении TestCase он вводит вспомогательный метод для входа в систему как определенный пользователь. Вы бы использовали его так...

$user = User::find($id);
$this->be($user);