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