Черта не найдена в блочных тестах 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);