Тестирование пользовательской модели снаружи Laravel - PullRequest
0 голосов
/ 16 марта 2020

Введение

Я использую систему с несколькими микросервисами (9+). Каждый отдельный микросервис является экземпляром Laravel.

. Для унификации и централизации частей кодовой базы было создано внешнее частное репо composer общих элементов. К ним относятся модели, интерфейсы, черты, клиенты и т. Д. c. Например, объект User используется во многих микросервисах.

Этот репозиторий не является установкой Laravel, это просто «некоторый код» и не требует элемента оболочки / исполняемого элемента. Это соответствует стандартной структуре composer (/src/ et c).

У меня есть фрагмент кода, который выполняет некоторую проверку. Для одного из элементов требуется объект User. Это полностью работает внутри существующей кодовой базы.

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


// The class: 

namespace Example\Models\Core;

// ... other usual laravel use statements:
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{

}

Внутри теста:


// ... other includes: 
use Example\Models\Core\User;

class ClientTest extends TestCase
{

    public function testUserIssue() 
    {
    // attempt to instantiate an empty user:
    $user = new User();

    // other items:
    }
}

Когда запускаются модульные тесты, это вызывает:

Error: Class 'Illuminate\Foundation\Auth\User' not found

Класс User расширяется Illuminate\Foundation\Auth\User. Это внутри папки продавца. Похоже, что он правильно загружен, и автоматический переход по классам в PhPStorm работает, как и ожидалось. Объекты

User функционируют, как и ожидалось, когда этот репозиторий загружен и используется внутри laravel установки. Все мои другие микросервисы могут использовать объект User, как и ожидалось

Это сохраняется после composer update / install / dump-autoload.

Для ясности: я просто хочу передать немой User объект через функцию с подсказкой типа. Все, что требуется, - это одно свойство ($user->name) внутри этой функции. Никаких поисков в БД или каких-либо других причудливых вещей не требуется.

Использование следующего внутри тоже не помогает:

  • $user = $this->createMock(User::class);
  • $user = $this->createPartialMock(User::class, []);

Вопрос 1

Почему этот класс не может быть создан / как его создать

Вопрос 2

Можно ли создать экземпляр класс с игнорированием зависимостей ... По сути, stdClass() или анонимный класс, который перезаписывает другой объект для целей тестирования?

1 Ответ

0 голосов
/ 18 марта 2020

По вопросу 1:

Я смог загрузить класс вручную с помощью include(). Это было неудовлетворительно, но привело меня к более подходящему решению.

Извлечение отдельных классов / зависимостей с помощью composer не получило их так, как, похоже, понравилась автоматическая загрузка PSR-4.

Заменив отдельные composer библиотеки на "laravel/framework": "^7.0", внутренняя структура, похоже, заработала.

Это связывает код с Laravel, что не идеально, но с учетом того, что они Laravel микросервисы, этого и следовало ожидать. Там также гораздо больше кода, чем нужно на самом деле, и это раздувает папку продавца (если только для обычных файлов репо).

По вопросу 2:

Кажется, что нет путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...