Работа с ключевым словом «новое» в модульном тесте PHP

В моем случае у меня есть класс, например:

class Logger
{
/**
 * @var EntityManager
 */
protected $entityManager;

public function __construct(EntityManager $entityManager)
{
    $this->entityManager = $entityManager;
}

/**
 * @param Model $model
 */
public function log(Model $model)
{
    $logEntity = new LogEntity();
    $logEntity->setOrder($model->getOrder());
    $logEntity->setType($model->getType());
    $logEntity->setScore($model->getScore());
    $logEntity->setCreated(new DateTime());
    $logEntity->setModified(new DateTime());

    $this->entityManager->persist($logEntity);
    $this->entityManager->flush();

    return $logEntity;

}

Класс Logger не подлежит тестированию, потому что в моем коде существует ключевое слово «new», с другой стороны, класс Logger и класс EntityManager зарегистрировали синглтон в контейнере и не могут внедрить модель как зависимость.

Как изменить класс для перехода на тестируемый класс?

LoggerModel — это сущность Doctrine, используемая в среде Laravel.

Стоит ли изучать 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 и хотите разрабатывать...
2
0
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я решаю эту проблему с помощью примера решения: Заводской узор.

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

И как?

Я создаю класс с методом, который может быть одноэлементным сервисом:

class LogFactory
{
    public function makeLogEntity()
    {
        return new LogEntity();
    }
}

В другом сервисе введите класс factory:

class Logger
{
/**
 * @var EntityManager
 */
protected $entityManager;

/**
 * @var LogFactory
 */
protected $logFactory;

public function __construct(EntityManager $entityManager, LogFactory $logFactory)
{
    $this->entityManager = $entityManager;
    $this->logFactory = $logFactory
}

/**
 * @param Model $model
 */
public function log(Model $model)
{
    $logEntity = $this->logFactory->makeLogEntity();
    $logEntity->setOrder($model->getOrder());
    $logEntity->setType($model->getType());
    $logEntity->setScore($model->getScore());
    $logEntity->setCreated(new DateTime());
    $logEntity->setModified(new DateTime());

    $this->entityManager->persist($logEntity);
    $this->entityManager->flush();

    return $logEntity;

}

Теперь у меня есть сервис, который может имитировать и вызывать функцию $mock->willReturn() в тесте.

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