Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Testes usando Doctrine

Boa noite professor,

gostaria de saber se tem como fazer teste com o banco de dados utilizando o Doctrine. Tentei usa o beginTransaction e rollBack mas da um erro bem na linha do flush quando vou tentar inserir alguma informação(erro: "ReflectionException: Given object is not an instance of the class this property was declared in ...").

Pensei estar passando a instancia errado do Entity Manager, mas em outros teste de busca ao banco este mesmo Entity Manager está funcionando então acho que não é isso.

Na Documentação do doctrine fala sobre essas funções de beginTransaction e rollBack, mas fala mais sobre melhorar desempenho e nada sobre testes.

Desde já, agradeço!

3 respostas

Fala, Guilherme. É perfeitamente possível. O código de testes é um código real, como qualquer outro. Esse seu erro tem relação com alguma implementação incorreta mesmo. Compartilha seu código e o erro completo (com a stack trace) pra eu entender.

Boa noite professor, segue o código

Classe de Teste

class UserRepositoryTest extends TestCase
{
  private static EntityManagerInterface $entityManager;
  private static UserRepository $userRepository;

  public static function setUpBeforeClass(): void
  {
    self::$entityManager = (new EntityManagerFactory)->getEntityManager();
    self::$userRepository = new UserRepository(self::$entityManager);
  }

  protected function setUp(): void
  {
    self::$entityManager->beginTransaction();
  }

  protected function tearDown(): void
  {
    self::$entityManager->rollback();
  }

  public function testPersistencyAndSearchOfANewUser(): void
  {
    $user = new User('Test', 'test@test.com', 'passwordtest1', 'passwordtest1');

    self::$userRepository->persistUser($user);
    $user = self::$userRepository->checkIfIsRegistered('Test', 'test@test.com');

    self::assertSame('Test', $user->getName());
    self::assertSame('test@test.com', $user->getEmail());
  }
}

Pelo construtor do User eu apenas coloca as informações nas variáveis corretas. O beginTransaction e rollBack estão sendo usados da forma correta?

UserRepository

class UserRepository
{
  private EntityManagerInterface $entityManager;

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

  public function persistUser(User $user): void
  {
    $this->entityManager->persist($user);
    $this->entityManager->flush();
  }
}

Só coloquei o código da função de persistência porque é nela que ocorre o erro. Na função de teste onde eu procuro logo depois de dar a persistência, o código funciona dando um erro que nenhum um usuário foi encontrado, pois a persistência não ocorreu.

A linha 36 onde acontece o erro é quando eu chamo a função "self::$userRepository->persistUser($user);" na classe de testes. E a linha 44 é bem no flush da função de persistência "$this->entityManager->flush();".

Stack Trace:

projeect\Tests\Model\Repositories\UserRepositoryTest::testPersistencyAndSearchOfANewUser
ReflectionException: Given object is not an instance of the class this property was declared in

C:\xampp\htdocs\projeect\vendor\doctrine\persistence\lib\Doctrine\Persistence\Reflection\TypedNoDefaultReflectionProperty.php:21
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\Mapping\ReflectionEmbeddedProperty.php:81
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php:644
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php:503
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php:817
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php:344
C:\xampp\htdocs\project\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php:371
C:\xampp\htdocs\project\src\Model\Repositories\UserRepository.php:44
C:\xampp\htdocs\project\tests\Model\Repositories\UserRepositoryTest.php:36

Desde já, agradeço!

solução!

Boa noite professor,

consegui resolver o erro, eu não estava declarando algumas variáveis direito e estava fazendo a checagem do usuário no banco de dados de maneira errada. O erro nem era no teste.

Agradeço a atenção!