С PHPUnit Class 'mysqli' не найден

Я только начал с PHPUnit . Некоторые простые тесты, которые я написал, работают. Так что в общем PHPUnit работает. Однако что-то не так с классом MySQLi.

В моем коде он отлично работает. Вот строка:

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

Когда эта строка обрабатывается phpunit, я получаю следующее сообщение об ошибке (указывающее на эту строку):

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

Две возможности (как я вижу):

1) Я пропустил какой-то элемент / расширение / шаг конфигурации / что-то еще, связанное с правильной настройкой PHPUnit, работающей с расширением MySQLi.

РЕДАКТИРОВАТЬ

Если я тестирую расширение extension_loaded('mysqli') он возвращает true в моем обычном коде. Если я делаю следующее в тесте, он пропускает тест (т.е. возвращает false ):

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

/РЕДАКТИРОВАТЬ

2) Может возникнуть проблема с моим кодом. Я пытаюсь высмеять объект User, чтобы выполнить тестовое соединение. Итак, вот оно:

 <?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('p@ssw0rd')); $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); } } с <?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('p@ssw0rd')); $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); } } 

Проверенный класс подключения выглядит следующим образом:

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

РЕШЕНИЕ

Вся эта проблема связана с установкой. Я использую установку XAMPP, которая предоставляет мой PHP. Установка PHPUnit независимо делает его использование другой установки! Так что в моем браузере (питание XAMPP) все было хорошо, но в моей командной строке расширение MySQLi пропало без вести вместе! Debian предоставляет пакет под названием php5-mysqlnd . После этого все работает отлично! (кроме появления других ошибок 🙂

Solutions Collecting From Web of "С PHPUnit Class 'mysqli' не найден"

PHPUnit обычно работает в интерфейсе командной строки CLI.

PHP, который у вас там, отличается от веб-сервера. Различные бинарные и часто разные конфигурации.

 $ php -r "new mysqli();" 

Должна дать вам ту же ошибку. Проверьте, где находится двоичный файл и конфигурация:

 $ which php 

А также

 $ php -i | grep ini 

Убедитесь, что у вас установлено расширение для класса mysqli и включено. После настройки вы сможете безупречно запускать свои юнит-тесты.