PHPUnit 忽略 Apache 环境变量

标签 php mysql mysqli phpunit codeception

我正在使用 Codeception,它利用 PHPUnit 作为其单元测试框架,并且有许多单元测试

我最近使用存储在 php 配置文件中的连接信息(而不是硬编码)更新了我的数据库连接。

$host = getenv('RDS_HOST');
$user = getenv('RDS_USER');
$password = getenv('RDS_PASSWORD');
$schema = getenv('RDS_SCHEMA');

$mysqli = new \mysqli($host, $user, $password, $schema);

我的应用在这些更改后运行良好。

问题是,我的许多单元测试现在都被破坏了,运行单元测试会导致错误消息:

[PHPUnit_Framework_Exception] mysqli::mysqli(): (HY000/2002): No such file or directory

我创建单元测试只是为了查看 PHPUnit 是否会读取我的环境变量。似乎没有。 PHPUnit 似乎忽略了我的环境变量。

如何让 PHPUnit/Codeception 识别和使用 Apache 环境变量?

最佳答案

PHPUnit 通过 cli 运行,web 应用程序通过 apache 运行,这就是为什么一个工作而另一个不工作的原因。

例如,如果您从命令行在 Linux 系统上运行测试,您可以导出环境变量。

$ export RDS_HOST=host; export RDS_USER=user; and so on... vendor/bin/phpunit 

这些环境变量随后将通过 getenv 在 php 中可用。而在 apache 中,例如,您可以将它们设置在虚拟主机中,以便在 apache 运行时,这些环境变量可用于 PHP。

有很多方法可以解决这个问题,我不知道有什么确定的解决方案。这取决于应用范围及其需要。 vlucas/phpdotenv是我能想到的唯一一个包,我认为它有助于解决某些用例的这个问题。

深入研究:How Laravel Solves It

关于PHPUnit 忽略 Apache 环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945720/

相关文章:

java - 使用 php 和 android 从 sql 数据库中选择所有内容

php - 我该如何使用 cron?

PHP/MySQL : 30 day interval for pre-paid membership

php - MySQL 中的浮点值本身

java - 使用数据库的条形图不显示

mysql - Mysql 两个表的条​​件查询

php - 在生产中使用 mysqli_connect() 从 Mysql 选择行时出现问题

php - 从 php 5.3 升级到 php 5.5 显示连接错误

mysql - 不等于 LeftJoin 的搜索

php - Webmatrix 用户 '' @'localhost' 访问被拒绝(使用密码 : NO)