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 :-)
¿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
¿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
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