es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir una prueba unitaria para una consulta de MongoDB construida con queryBuilder en Symfony.

Estoy luchando por entender cómo escribir pruebas unitarias para este fragmento de código.

$qb = $documentManager->getRepository('Document:Account')->createQueryBuilder();
$qb->remove(\project\Document\Account::class)->field('username')
   ->equals($userAccount->getUsername())->getQuery()->execute();

Aquí está mi intento de simular esta parte:

$account = new Account();
$documentAccount = $this->createMock(DocumentAccount::class);
$this->dm->expects($this->any())->method('getRepository')
     ->with($documentAccount)
     ->willReturn($account);

Pero sigo obteniendo este error cuando el control llega a esta parte.

Ver imagen

Gracias de antemano.

PHPUnit: PHPUnit 8.5.21

PHP: PHP 7.2.34

Symfony: Symfony 4.4.18

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Prueba de unidad del código utilizando Doctrine ORM

    Las pruebas de unidad son una parte crucial del desarrollo de software, ya que ayudan a identificar errores o problemas en el código. Si tienes dificultades para escribir pruebas de unidad para un fragmento de código que involucra Doctrine ORM, puedes seguir el enfoque que se muestra a continuación:

    Primero, debes crear un simulador para el administrador de documentos y el repositorio. Luego, puedes utilizar el repositorio simulado para crear una instancia del generador de consultas. Por último, puedes agregar aserciones para comprobar los resultados esperados.

    Aquí tienes el fragmento de código modificado:

    public function testDeleteAccount()
    {
        // Arrange
        $username = 'test_user';
        $repository = $this->createMock(AccountRepository::class);
        $qb = $this->createMock(QueryBuilder::class);
        $query = $this->createMock(AbstractQuery::class);
        $dm = $this->createMock(DocumentManager::class);
        $account = new Account();
        $userAccount = new Account();
        $userAccount->setUsername($username);
    
        $repository->expects($this->any())
            ->method('createQueryBuilder')
            ->willReturn($qb);
    
        $qb->expects($this->any())
            ->method('remove')
            ->with(Account::class)
            ->willReturnSelf();
    
        $qb->expects($this->any())
            ->method('field')
            ->with('username')
            ->willReturnSelf();
    
        $qb->expects($this->any())
            ->method('equals')
            ->with($username)
            ->willReturnSelf();
    
        $qb->expects($this->any())
            ->method('getQuery')
            ->willReturn($query);
    
        $query->expects($this->any())
            ->method('execute')
            ->willReturn($account);
    
        $dm->expects($this->any())
            ->method('getRepository')
            ->with(Account::class)
            ->willReturn($repository);
    
        // Act
        $result = $this->accountService->deleteAccount($userAccount);
    
        // Assert
        $this->assertSame($account, $result);
    }
    

    En el código anterior, hemos creado un simulador de las clases AccountRepository y QueryBuilder. Luego, hemos definido las llamadas esperadas a los métodos de estos simuladores. Finalmente, hemos creado un simulador de la clase DocumentManager y establecido las expectativas para el método getRepository.

    También hemos creado una instancia de la clase Account para ser devuelta como resultado de la llamada al método execute. En el método deleteAccount, este resultado se devuelve al llamador.

    Esto debería ayudarte a escribir pruebas de unidad para código que utiliza Doctrine ORM.

Comments are closed.