#unit-testing #symfony #phpunit #symfony5
#модульное тестирование #symfony #phpunit #symfony5
Вопрос:
Я работал над сеточным пакетом для Symfony. Пакет получает объект Symfony и на его основе отображает gridview.
что-то вроде этого:
class IndexController extends AbstractController
{
public function __construct(GridBuilder $grid, BookGrid $userGrid)
{
$this->grid = $grid;
$this->userGrid = $userGrid;
}
/**
* @Route("/")
*/
public function index()
{
return $this->render('index.html.twig', [
'grid' => $this->grid->build($this->userGrid),
]);
}
}
BookGrid
является ли класс расширенным, из BaseGridConfigurator
которого он должен реализовать getEntity
метод:
class BookGrid extends BaseGridConfigurator
{
public function getEntity()
{
return Book::class;
}
}
GridBuilder использует EntityRepository (в данном случае BookRepository) для получения метаданных объекта, таких как поля, репозиторий и QueryBuilder .
Если я хочу написать модульный тест для пакета, мне нужен класс сущности, чтобы передать его в GridBuilder. Я думаю, что есть два подхода к решению этой проблемы.
- Создайте макет объекта и репозитория
- Создайте реальную сущность и класс репозитория внутри моего тестового каталога
Мой вопрос в том, какой подход правильный? и есть ли какой-либо другой способ протестировать пакет, который зависит от объекта?
Спасибо
Комментарии:
1. Здесь нет такого понятия, как «правильный» подход. Выберите тот, который работает для вас лучше всего
Ответ №1:
Предполагая getEntity
, что (который, возможно, следует переименовать в getEntityClass
) используется GridBuilder
для получения желаемого репозитория сущностей из entity manager внутренне, не было бы проще BaseGridConfigurator
предоставить доступ к репозиторию сущностей напрямую? Например. getEntityRepository(): EntityRepository
вместо getEntity(): string
. Я могу себе представить, что это значительно уменьшило бы количество насмешек, которые вам пришлось бы делать, если все, что вам нужно, это репозиторий сущностей.
В любом случае, документация Symfony по теме модульного тестирования репозиториев объектов рекомендует не использовать модульное тестирование зависимых от репозитория объектов реализаций в целом.
Но если вам нужно, я бы сосредоточился на дизайне, в котором вашей реализации требуется как можно меньше точек соприкосновения с репозиторием сущностей, чтобы свести к минимуму количество насмешек, требуемых тестом. Но все равно предпочел бы издеваться над заглушкой, несмотря ни на что.
Комментарии:
1. Спасибо за ответ. На самом деле, это не имеет никакого значения, если я запрашиваю доступ к
Repo
классу. В этом случае мне также нужно создать макет или заглушку для репозитория, с которым я столкнусь с той же проблемой.