В моем случае у меня есть класс, например:
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.






Я решаю эту проблему с помощью примера решения: Заводской узор.
Мне нужно утверждение, поэтому, когда я получу новую модель с завода, заявите об этом как о макете.
И как?
Я создаю класс с методом, который может быть одноэлементным сервисом:
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() в тесте.