Вопрос по php – С PHPUnit класс 'mysqli' не найден

8

Я только начал с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.

EDIT

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

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

/EDIT

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('[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);
    }
}

Протестированный класс 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;
    }
}

SOLUTION

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

Я на этом! Смотрите мои изменения в вопросе. Пока что кажется, что из командной строки запускается расширение! Неустранимая ошибка PHP: класс «mysqli» не найден в коде командной строки в строке 1 fourreux
Кроме того, что это работает в моем коде? Как я уже сказал: строка кода создает действительный объект mysqli, если он запускается сам по себе (т.е. без phpunit). PHP настроен с mysqlnd (5.0.8-dev - 20102224 - $ Редакция: 310735 $) fourreux
Являются лиmysqli class requirements встретились? Упражнение. Пожалуйста, продемонстрируйте, что они с коротким тестовым кодом и его выводом. hakre
Почему вы используете xamp, когда используете Debian? В Debian есть все, что можно пожелать;) Я добавлю ответ. hakre
Если вы запускаете в оболочке, что дает:$ php -r "new mysqli();"? Какую конфигурацию использует PHPUnit? Пожалуйста, предоставьте доказательство того, что когда вы вызываете PHP для PHPUnit, он настроен. PHP говорит вам, что класс не существует, следовательно: вы не настроили расширение. hakre

Ваш Ответ

1   ответ
5

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

$ php -r "new mysqli();"

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

$ which php

А также

$ php -i | grep ini

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

Для меня это было непросто, оказалось, что это была причуда в бинарной сборке, которую я использовал. Ваши советы помогли мне разобраться, спасибо!

Похожие вопросы