Внедрение зависимостей Symfony или расположение службы для репозиториев в тестах PHPUnit

#symfony #testing #phpunit #repository-pattern #api-platform.com

#symfony #тестирование #phpunit #репозиторий-шаблон #api-platform.com

Вопрос:

Я пишу тест для своего кода на платформе API (построенной на Symfony 5) и PHPUnit.

Я создал базовый тестовый набор с именем TestContext that extends ApiTestCase . Все мои классы тестов будут расширяться TestContext для повторного использования шаблонного кода общего тестирования.

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

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

Комментарии:

1. Технически вы ищете расположение службы, а не внедрение зависимостей. Не могли бы вы обработать свою очередь редактирования, чтобы я мог отправить редактирование?

Ответ №1:

Для того, чтобы внедрить репозиторий для тестов API, у меня есть src/Test/BaseApiTest.php

 namespace AppTest;

use ApiPlatformCoreBridgeSymfonyBundleTestApiTestCase;
use DoctrineORMEntityManagerInterface;
use HautelookAliceBundlePhpUnitReloadDatabaseTrait;

class BaseApiTestCase extends ApiTestCase
{
    use ReloadDatabaseTrait;

    protected ?EntityManagerInterface $em;

    protected function setUp(): void
    {
        $kernel = self::bootKernel();

        $this->em = $kernel->getContainer()
            ->get('doctrine')
            ->getManager();
    }
}
  

Затем для теста в моем корневом tests каталоге я получаю к нему доступ следующим образом:

 //tests/UserRessourceTest.php
<?php

namespace AppTests;

use AppEntityUser;
use AppTestBaseApiTestCase;

class UserResourceTest extends BaseApiTestCase
{
    public function testDeleteAccount(): void
    {
        ...
        /** @var User $deletedUser */
        $deletedUser = $this->em->getRepository(User::class)->findOneById($user->getId());
        ...
    }
}
  

Это хорошо работает для большинства моих случаев. Я надеюсь, что это сработает для вас 😉