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 на неправилна и тествах какво ще се случи в artisan server (извикан с команда php artisan serve ---> http://localhost:8000/). В браузъра всичко работи като чар, но когато се опитам да извикам ``phpunit` в конзолата резултатът не е същият.

Опитах се да видя дали уеб сървърът и 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

Можете ли да ми дадете съвет или решение на този проблем?

Благодаря ви за отделеното време :)


person melanholly    schedule 23.04.2014    source източник


Отговори (7)


Изглежда, че Laravel използва SQLite като база данни за тестване. Вижте обратната следа на ред 2:

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

Но това изглежда не е инсталирано на вашата система. Така че мисля, че трябва да инсталирате SQLite драйвера.

person common sense    schedule 23.04.2014
comment
Добре, това изглежда е проблем, защото наистина нямам инсталиран драйвер за SQLite PDO. Ще тествам нещата по-късно. - person melanholly; 23.04.2014
comment
Най-накрая се прибрах и тествах нещата. Изглежда, че не чета всички съобщения за грешки. Благодаря ти за помощта. - person melanholly; 23.04.2014

Ако използвате 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
person Web Developer in Pune    schedule 19.10.2016
comment
Имам php 7.1 какво трябва да се очаква? - person Tajuddin Khandaker; 06.09.2019

Ако заемате SqLite, трябва да въведете php.init и да разкоментирате този ред.

;extension = pdo_sqlite
person Mau Web    schedule 05.09.2019
comment
Направих го, но все още показвам $ php artisan migrate --env=testing PHP Предупреждение: Стартиране на PHP: Не може да се зареди динамична библиотека '/usr/lib/php/20160303/php_pdo_sqlite.dll' - /usr/lib/php/20160303/php_pdo_sqlite .dll: не може да отвори споделен обектен файл: Няма такъв файл или директория в Unknown на ред 0. Моята операционна система е Ubuntu 14.04 LTS - person Tajuddin Khandaker; 06.09.2019
comment
Отделно разкоментирайте този ред в php.unit extension = pdo_sqlite Във вашия файл phpunit.xml трябва да имате тези два реда ‹server name = DB_CONNECTION value = sqlite /› ‹server name = DB_DATABASE value = : memory: /› - person Mau Web; 07.09.2019

В Windows трябваше да активирам extension=php_pdo_sqlite.dll в php.ini.

person Fabian Picone    schedule 30.06.2017

За тези, които използват Laravel Homestead, уверете се, че изпълнявате phpunit от вътре в em> Homestead, а не на вашата локална машина! Можете да SSH в него с vagrant ssh.

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

person camelCase    schedule 26.10.2017

php7.0-sqlite вече не работи, използвайте php7.1-sqlite

sudo apt-get install php7.1-sqlite3
sudo service apache2 restart
person Winnipass    schedule 09.04.2018
comment
Стартирах sudo apt-get update след това sudo apt-get install php7.1-sqlite, но получих тези грешки: E: Unable to locate package php7.1-sqlite E: Couldn't find any package by glob 'php7.1-sqlite' E: Couldn't find any package by regex 'php7.1-sqlite' - person mikhail-t; 11.04.2018
comment
опитайте sudo apt-get инсталирайте php7.1-sqlite3 - person Winnipass; 11.04.2018
comment
този подъл 3 пропуснах, във всеки случай направих apt-cache search php7.1-sqlite3 и не получих резултати от търсенето, и същото за php7.1-sqlite само php7.0-sqlite връща php7.0-sqlite3 - SQLite3 module for PHP, може да ми липсва необходимия ppa (използвам подсистема Ubuntu в Windows) - person mikhail-t; 12.04.2018

първо инсталирайте SQLite за PHP с sudo apt-get install php-sqlite3

след това проверете своя php.ini и се уверете, че редът по-долу не е коментиран

;extension = pdo_sqlite

тогава, ако използвате apache

sudo service apache2 restart

или ако използвате Nginx

sudo service nginx restart


забележка: ако не знаете къде е вашият php.ini път, използвайте командата php -i |grep php.ini

person Mahdi mehrabi    schedule 16.08.2020