2012-04-17 55 views
7

Acabo de comenzar con PHPUnit. Algunas pruebas simples que escribí están funcionando. Entonces, en general, PHPUnit está en funcionamiento. Sin embargo, hay algo mal con la clase MySQLi.Con PHPUnit Class 'mysqli' no se encuentra

En mi código funciona bien. Aquí está la línea:

$this->mysqli = new \mysqli($this->host, $user->getUser(), $user->getPwd(), $this->db); 

Cuando esta línea se analiza PHPUnit correr me sale el siguiente mensaje de error (que apunta a esa línea):

PHP Fatal error: Class 'mysqli' not found in /opt/lampp/htdocs/... 

dos posibilidades (como yo lo veo):

1) Me falta algo de función/extensión/paso de configuración/algo más relacionado con una configuración correcta de PHPUnit que trabaja con la extensión MySQLi.

EDITAR

Si hago la prueba para la extensión extension_loaded('mysqli') vuelve true en mi código normal. Si hago lo siguiente dentro de la prueba se salta la prueba (es decir, se vuelve false):

if (!extension_loaded('mysqli')) { 
    $this->markTestSkipped(
     'The MySQLi extension is not available.' 
    ); 
} 

/EDIT

2) Puede haber un problema con mi código. Estoy tratando de burlarme de un objeto de Usuario para hacer una conexión de prueba. Así que aquí está:

<?php 
class ConnectionTest extends \PHPUnit_Framework_TestCase 
{ 
    private $connection; 

    protected function setUp() 
    { 
     $user = $this->getMockBuilder('mysqli\User') 
        ->setMethods(array('getUser', 'getPwd')) 
        ->getMock(); 
     $user->expects($this->once()) 
      ->method('getUser') 
      ->will($this->returnValue('username')); 
     $user->expects($this->once()) 
      ->method('getPwd') 
      ->will($this->returnValue('[email protected]')); 

     $this->connection = new \mysqli\Connection($user); 
    } 

    public function testInternalTypeGetMysqli() 
    { 
     $actual = $this->connection->getMysqli(); 
     $expected = 'resource'; 

     $this->assertInternalType($expected, $actual); 
    } 

    protected function tearDown() 
    { 
     unset($this->connection); 
    } 
} 

La clase de conexión a prueba es el siguiente:

<?php 
namespace mysqli; 

class Connection 
{ 
    protected $mysqli; 
    protected $host = 'localhost'; 
    protected $db = 'database'; 

    public function __construct(\mysqli\User $user) 
    { 
     $this->mysqli = new \mysqli($this->host, 
            $user->getUser(), 
            $user->getPwd(), 
            $this->db); 
     if (mysqli_connect_errno()) { 
      throw new \RuntimeException(mysqli_connect_error()); 
     } 
    } 

    public function getMysqli() 
    { 
     return $this->mysqli; 
    } 
} 

SOLUCIÓN

Todo esto es/era un problema de instalación. Estoy usando una instalación XAMPP que proporciona mi PHP. La instalación de PHPUnit hace que sea independiente de una configuración diferente. Así que en mi navegador (XAMPP powered) todo estaba bien, pero en mi línea de comandos la extensión MySQLi ha faltado todos juntos. Debian proporciona un paquete llamado php5-mysqlnd. ¡Tener esto instalado funciona bien! (excepto que aparezcan otros errores :-)

+0

¿Se cumplen los requisitos de clase ['mysqli'] (http://www.php.net/manual/en/mysqli.requirements.php)? Ejercicio: demuéstrese que tienen un código de prueba breve y se emite. – hakre

+0

¿Aparte de lo que está funcionando en mi código? Como dije: la línea de código produce un objeto mysqli válido si se ejecuta solo (es decir, sin phpunit). PHP está configurado con mysqlnd (5.0.8-dev - 20102224 - $ Revision: 310735 $) – fourreux

+1

Si ejecuta en shell, ¿qué ofrece: '$ php -r" new mysqli(); "'? ¿Qué configuración usa PHPUnit? Proporcione una prueba de que cuando invoque PHP para PHPUnit esté configurado. PHP te dice que la clase no existe, ergo: no has configurado la extensión. – hakre

Respuesta

5

PHPUnit normalmente se ejecuta dentro de la CLI - interfaz de línea de comandos.

El PHP que tienes allí es diferente que con el servidor web. Diferente configuración binaria y a menudo diferente también.

$ php -r "new mysqli();" 

Deberías dar el mismo error. Verificar donde se encuentra el binario y configuración:

$ which php 

Y

$ php -i | grep ini 

Asegúrese de que tienes the extension for the mysqli class instalado y activado. Una vez configurado, debería poder ejecutar sus pruebas unitarias sin problemas.

+0

Esto fue complicado para mí, resultó ser una peculiaridad en la construcción binaria que estaba usando. Tus consejos me ayudaron a descifrarlo, ¡gracias! –

Cuestiones relacionadas