PDOException: не удалось найти драйвер при использовании phpunit

Я начинаю использовать laravel 4, и я пытаюсь начать использовать модульные тесты, чтобы я мог сделать свою жизнь проще. Ну, как вы все догадались, мое развитие не стало легче после тестирования phpunit. Простые тесты хорошо, легко, но когда вещи начинают немного усложняться, они не идут, как я, хотя они и будут.

Проблема в том, что я провел простые тесты, но я получаю некоторые странные ошибки PDOException: could not find driver. Я прочитал несколько статей и сообщений по этой теме, но ничто не решило мою проблему. Я установил php5-mysql и когда я вызываю php -m он говорит, что у меня есть PDO и pdo_mysql. Фактической командой, которую я использую, является php -m |grep -i "pdo" а выход:

PDO
pdo_mysql

Ну, я попытался выполнить тест класса PDOException в браузере. С этой целью я изменил пароль пользователя mysql на неверный и проверил, что произойдет на сервере-ремесленнике (вызываемый командой php artisan serve ---> http://localhost:8000/). В браузере все работает как прелесть, но когда я пытаюсь вызвать "phpunit" в консоли, результат не совпадает.

Я попытался посмотреть, есть ли у webserver и cli разные файлы конфигурации, но явка, что файлы идентичны. Файлы конфигурации, которые я сравнивал:

для веб-сервера

/etc/php5/apache2/conf.d/20-pdo_mysql.ini
/etc/php5/apache2/conf.d/05-opcache.ini
/etc/php5/apache2/conf.d/20-json.ini
/etc/php5/apache2/conf.d/20-mysql.ini
/etc/php5/apache2/conf.d/20-mysqli.ini
/etc/php5/apache2/conf.d/10-pdo.ini
/etc/php5/apache2/conf.d/20-mcrypt.ini
/etc/php5/apache2/conf.d/20-curl.ini
/etc/php5/apache2/php.ini

для командной строки

/etc/php5/cli/conf.d/20-pdo_mysql.ini
/etc/php5/cli/conf.d/05-opcache.ini
/etc/php5/cli/conf.d/20-json.ini
/etc/php5/cli/conf.d/20-mysql.ini
/etc/php5/cli/conf.d/20-mysqli.ini
/etc/php5/cli/conf.d/10-pdo.ini
/etc/php5/cli/conf.d/20-mcrypt.ini
/etc/php5/cli/conf.d/20-curl.ini
/etc/php5/cli/php.ini

чтобы сравнить их. Я использую команду diff как diff -s/path/to/file1/path/to/file2.

Ошибки выглядят так:

1) ExampleTest::testBasicExample
PDOException: could not find driver

/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:47
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php:22
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:59
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:47
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:127
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:63
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php:167
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php:135
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:366
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:93
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:56
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Console/Command.php:108
/var/www/smlsspd/vendor/symfony/console/Symfony/Component/Console/Command/Command.php:241
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Console/Command.php:96
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Console/Application.php:96
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Foundation/Artisan.php:57
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:208
/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:208
/var/www/smlsspd/app/tests/TestCase.php:70
/var/www/smlsspd/app/tests/TestCase.php:70
/var/www/smlsspd/app/tests/TestCase.php:46
phar:///var/www/smlsspd/phpunit.phar/phpunit/TextUI/Command.php:179
phar:///var/www/smlsspd/phpunit.phar/phpunit/TextUI/Command.php:132

Можете ли вы дать мне подсказку или решение этой проблемы?

Спасибо за ваше время :)

Ответ 1

Кажется, Laravel использует SQLite в качестве базы данных для тестирования. См. Обратную линию по строке 2:

/var/www/smlsspd/vendor/laravel/framework/src/Illuminate/Database/Connectors/SQLiteConnector.php:22

Но это кажется не установленным в вашей системе. Поэтому я думаю, вам нужно установить драйвер SQLite.

Ответ 2

Если вы используете sqlite для тестирования, вам понадобятся драйверы php sqlite

Для Ubuntu 14.04

sudo apt-get install php5-sqlite
sudo service apache2 restart

В Ubuntu 16.04 нет php5-sqlite

sudo apt-get install php7.0-sqlite
sudo service apache2 restart

Ответ 3

В Windows мне пришлось активировать extension=php_pdo_sqlite.dll в php.ini.

Ответ 4

Для тех, кто использует Laravel Homestead, убедитесь, что вы используете phpunit из Homestead, а не на своей локальной машине! Вы можете использовать SSH с vagrant ssh.

Как отмечали другие, для этого требуется SQLite, и, таким образом, его запуск в вашей виртуальной машине обеспечивает доступность вашего теста.

Ответ 5

Если вы занимаетесь SqLite, вам нужно ввести php.init и раскомментировать эту строку.

;extension = pdo_sqlite

Ответ 6

php7.0-sqlite больше не работает php7.1-sqlite

sudo apt-get install php7.1-sqlite3
sudo service apache2 restart