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.

Configurando un paquete de Symfony con pruebas unitarias contra una base de datos.

Estoy utilizando Pimcore, un framework con Symfony en su núcleo. Pimcore está programado por personas que no comprenden las pruebas unitarias. Están estrechamente acoplados a la base de datos.

Estoy escribiendo un bundle para ampliar las funcionalidades de Pimcore. Sin embargo, algo sale mal cuando el núcleo de Pimcore intenta escribir en la base de datos:

Error: Llamada a una función miembro en nulo

/opt/vendor/pimcore/pimcore/lib/Pimcore.php:167
/opt/vendor/pimcore/pimcore/lib/Db.php:49
/opt/vendor/pimcore/pimcore/lib/Model/Dao/AbstractDao.php:37
/opt/vendor/pimcore/pimcore/lib/Model/AbstractModel.php:120
/opt/vendor/pimcore/pimcore/lib/Model/AbstractModel.php:54
/opt/vendor/pimcore/pimcore/models/DataObject/ClassDefinition.php:288
/opt/vendor/pimcore/pimcore/models/DataObject/Concrete.php:419
/opt/vendor/pimcore/pimcore/models/DataObject/Concrete.php:729
/opt/tests/DataObjectTest.php:28

El código que realmente falla es el siguiente:

/**
* @return \Pimcore\Db\ConnectionInterface|Connection
*/
public static function get()
{
/**
* @var \Pimcore\Db\ConnectionInterface $db
*/
$db = \Pimcore::getContainer()->get(‘database_connection’);

return $db;

}

Estoy dispuesto a crear el esquema de la base de datos y probarlo contra una base de datos específica para esta biblioteca, ya que es literalmente imposible simular la base de datos. Sin embargo, no tengo idea de cómo hacerlo, ya que estoy en un bundle independiente que no tiene todo el directorio de configuración en el que se define Doctrine, etc., ni tiene un Kernel.php que construye el contenedor.

Entonces, mi pregunta básicamente es, ¿cómo puedo configurar una conexión de base de datos del Kernel utilizada por PHPUnit?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para configurar una conexión de base de datos Kernel utilizada por PHPUnit en un paquete independiente sin un directorio de configuración completo o un archivo Kernel.php, puede seguir estos pasos:

    1. Cree una base de datos de prueba y un usuario para su aplicación
    2. Cree un nuevo archivo de inicio en su directorio de pruebas, por ejemplo, tests/bootstrap.php. Este archivo debe incluir el siguiente código:

    <?php
    
    use Symfony\Component\Dotenv\Dotenv;
    
    // Cargar variables de entorno
    $envFile = __DIR__ . '/../.env.test';
    if (file_exists($envFile)) {
        (new Dotenv())->loadEnv($envFile);
    }
    
    // Cargar el autoloader
    require_once __DIR__ . '/../vendor/autoload.php';
    
    // Configurar el kernel
    use Symfony\Component\HttpKernel\Kernel;
    use Symfony\Component\Config\Loader\LoaderInterface;
    
    class AppKernel extends Kernel
    {
        public function registerBundles()
        {
            return [
                new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
                new My\Bundle\MyBundle(),
            ];
        }
    
        public function registerContainerConfiguration(LoaderInterface $loader)
        {
            $loader->load(__DIR__ . '/config/config_test.yaml');
        }
    
        public function getCacheDir()
        {
            return $this->getProjectDir() . '/var/cache/' . $this->environment;
        }
    
        public function getLogDir()
        {
            return $this->getProjectDir() . '/var/log';
        }
    }
    
    // Configurar la conexión de la base de datos
    use Doctrine\DBAL\DriverManager;
    $client = Doctrine\DBAL\DriverManager::getConnection([
        'url' => $_ENV['DATABASE_URL'],
    ];
    
    
    1. Cree un directorio de configuración en su directorio de pruebas, por ejemplo, tests/config.

    2. Cree un archivo config_test.yaml dentro del directorio de configuración. Este archivo debe contener su configuración de doctrine, por ejemplo:

    doctrine:
      dbal:
        url: '%env(resolve:DATABASE_URL)%'
    
    1. Edite su archivo phpunit.xml.dist para incluir el nuevo archivo de inicio. Por ejemplo:
    <phpunit bootstrap="tests/bootstrap.php" ...="">
    

    Ahora, debería poder ejecutar pruebas de PHPUnit que utilicen una conexión de base de datos configurada por el Kernel. Por ejemplo, en su prueba, puede usar:

    $client = static::$kernel->getContainer()->get('doctrine')->getManager()->getConnection();
    

    Esto le proporcionará una conexión de base de datos para usar en sus pruebas.

Comments are closed.