2012-04-17 8 views
7

Ich habe gerade mit PHPUnit begonnen. Einige einfache Tests, die ich geschrieben habe, funktionieren. Im Allgemeinen läuft PHPUnit. Mit der MySQLi-Klasse stimmt jedoch etwas nicht.Mit PHPUnit Klasse 'mysqli' wurde nicht gefunden

In meinem Code funktioniert es gut. Hier ist die Zeile:

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

Wenn diese Zeile analysiert läuft phpunit ich die folgende Fehlermeldung (zeigt auf dieser Linie):

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

Zwei Möglichkeiten (wie ich es sehe):

1) Ich vermisse etwas Feature/Erweiterung/Konfigurationsschritt/etwas anderes im Zusammenhang mit einer korrekten Einrichtung von PHPUnit, das mit der MySQLi-Erweiterung arbeitet.

EDIT

Wenn ich Test für die Erweiterung extension_loaded('mysqli') es true in meinem normalen Code zurückgibt. Wenn ich die folgenden im Test durchführen überspringt er den Test (das heißt, es gibt false):

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

/EDIT

2) Es könnte ein Problem mit meinem Code. Ich versuche, ein Benutzerobjekt zu verspotten, um eine Testverbindung herzustellen. Also hier ist es:

<?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); 
    } 
} 

Die getestete Connection-Klasse sieht wie folgt aus:

<?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; 
    } 
} 

SOLUTION

Diese ganze Sache ist/war ein Installationsproblem. Ich verwende eine XAMPP Installation, die mein PHP bereitstellt. Die Installation PHPUnit unabhängig macht es ein anderes Setup verwenden! Also in meinem Browser (XAMPP powered) war alles in Ordnung, aber in meiner Kommandozeile hat die MySQLi Erweiterung alle zusammen gefehlt! Debian bietet ein Paket namens php5-mysqlnd. Mit dieser Installation funktioniert alles gut! (außer anderen Fehlern erscheinen :-)

+0

Sind die Anforderungen der [mysqli-Klasse] (http://www.php.net/manual/en/mysqli.requirements.php) erfüllt? Übung: Bitte demonstrieren Sie, dass sie einen kurzen Testcode haben und ausgegeben werden. – hakre

+0

Anders als es in meinem Code funktioniert? Wie gesagt: Die Codezeile erzeugt ein gültiges mysqli-Objekt, wenn es von selbst ausgeführt wird (dh ohne phpunit). PHP ist mit mysqlnd konfiguriert (5.0.8-dev - 20102224 - $ Revision: 310735 $) – fourreux

+1

Wenn Sie in der Shell laufen, was gibt: '$ php -r" new mysqli(); "'? Welche Konfiguration verwendet PHPUnit? Bitte stellen Sie einen Beweis dafür bereit, wenn Sie PHP for PHPUnit aufrufen, dass es konfiguriert ist. PHP sagt Ihnen, dass die Klasse nicht existiert, ergo: Sie haben die Erweiterung nicht konfiguriert. – hakre

Antwort

5

PHPUnit läuft normalerweise innerhalb der CLI - Befehlszeilenschnittstelle.

Die PHP, die Sie dort haben, ist anders als mit dem Webserver. Andere binäre und oft auch eine andere Konfiguration.

$ php -r "new mysqli();" 

Sollte Ihnen der gleiche Fehler geben. Stellen Sie sicher, wo die binäre und Konfiguration befindet:

$ which php 

Und

$ php -i | grep ini 

Stellen Sie sicher, Sie the extension for the mysqli class installiert und aktiviert haben. Einmal konfiguriert, sollten Sie in der Lage sein, Ihre Komponententests fehlerfrei auszuführen.

+0

Das war eine schwierige Sache für mich, es stellte sich heraus, eine Eigenart in der binären Build, den ich verwendete. Ihre Tipps haben mir geholfen, es zu verstehen, danke! –

Verwandte Themen