PDOException: 在使用phpunit时找不到驱动程序

25

我开始使用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`时,结果并不相同。

我尝试查看Web服务器和CLI是否具有不同的配置文件,但结果表明这些文件是相同的。我比较的配置文件如下:

对于Web服务器

/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

你能给我这个问题一些提示或解决方案吗?

谢谢你的时间 :)

9个回答

23

如果您在进行测试时使用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

我有PHP 7.1,应该期望什么? - Tajuddin Khandaker

23

看起来 Laravel 在测试中使用 SQLite 作为数据库。请查看第二行的回溯:

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

但是看起来这个在你的系统上没有安装。所以我认为你需要安装SQLite驱动程序。


好的,这似乎是个问题,因为我没有安装SQLite PDO驱动程序。稍后我会测试一下。 - melanholly
3
我终于回到家并测试了一下。看起来我没有阅读所有的错误信息。谢谢你的帮助。 - melanholly

8

如果你正在使用SqLite,你需要进入php.ini并取消注释这一行。

;extension = pdo_sqlite

我已经尝试过了,但仍然显示"$ php artisan migrate --env=testing PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/php_pdo_sqlite.dll' - /usr/lib/php/20160303/php_pdo_sqlite.dll: cannot open shared object file: No such file or directory in Unknown on line 0"。我的操作系统是Ubuntu 14.04 LTS。 - Tajuddin Khandaker
1
除了在php.unit中取消注释这一行 extension = pdo_sqlite 在您的phpunit.xml文件中,您必须有以下两行 <server name = "DB_CONNECTION" value = "sqlite" /> <server name = "DB_DATABASE" value = ": memory:" /> - Mau Web

4
在Windows操作系统中,我需要在php.ini文件中启用extension=php_pdo_sqlite.dll

3
对于使用 Laravel Homestead 的用户,请确保您从 Homestead 中运行 phpunit,而不是在本地机器上运行!您可以使用 vagrant ssh 进行 SSH 连接

正如其他人所提到的,它需要 SQLite,因此在虚拟机中运行可以确保测试可用。


2

php7.0-sqlite已不再适用,请使用php7.1-sqlite。

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

我运行了 sudo apt-get update 然后 sudo apt-get install php7.1-sqlite 但是出现了以下错误:E: 无法定位软件包 php7.1-sqlite E: 找不到匹配 glob 模式 'php7.1-sqlite' E: 找不到匹配正则表达式 'php7.1-sqlite' 的软件包 - mikhail-t
尝试使用sudo apt-get install php7.1-sqlite3安装。 - Winnipass
我错过了那个狡猾的“3”,无论如何,我执行了“apt-cache search php7.1-sqlite3”命令,但没有搜索结果,同样的情况也出现在“php7.1-sqlite”上,只有“php7.0-sqlite”返回了“php7.0-sqlite3 - 用于 PHP 的 SQLite3 模块”,我可能缺少所需的ppa(我在Windows上使用Ubuntu子系统)。 - mikhail-t

2

首先,使用sudo apt-get install php-sqlite3安装PHP的SQLite插件。

然后检查您的php.ini文件,并确保以下行没有被注释:

;extension = pdo_sqlite

如果你正在使用Apache,那么请执行以下命令:

sudo service apache2 restart

如果你正在使用Nginx,则请执行以下命令:

sudo service nginx restart


注意:如果你不知道php.ini的路径,请使用php -i |grep php.ini命令。


0
如果你使用mysql,请在phpunit.xml中添加这一行代码:
<server name="DB_CONNECTION" value="mysql"/>

然后在php中安装mysql包。
$ apt-get install php-mysql

请再试一次 :)


0
在 Laravel 中,只需在 phpunit.xml 文件中设置 "DB_CONNECTION""DB_DATABASE" 值即可。由于我使用的是 mysql(而不是 sqlite),因此我将它们更改为以下内容:
<server name="DB_CONNECTION" value="mysql"/>
<server name="DB_DATABASE" value="db_name"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接