Я только начал с 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 . После этого все работает отлично! (кроме появления других ошибок 🙂
PHPUnit обычно работает в интерфейсе командной строки CLI.
PHP, который у вас там, отличается от веб-сервера. Различные бинарные и часто разные конфигурации.
$ php -r "new mysqli();"
Должна дать вам ту же ошибку. Проверьте, где находится двоичный файл и конфигурация:
$ which php
А также
$ php -i | grep ini
Убедитесь, что у вас установлено расширение для класса mysqli
и включено. После настройки вы сможете безупречно запускать свои юнит-тесты.