我正在对多年前创建的实用程序函数进行一些基本单元测试,但它涉及访问 $_SERVER
数组。
由于我的单元测试是从命令行运行的,所以我必须自己手动设置数组的值。
这在使用 GitLab Runners 时效果很好,因为在 .gitlab-ci.yml
文件上我只是做了类似的事情:
before_script:
- export SERVER_PORT="80"
- export SERVER_NAME="gitlab"
我的测试目前无法测试该函数的所有语句,因为它检查 $_SERVER['SERVER_NAME']
值。
单元测试
public function testGetEnvironment() {
shell_exec('set SERVER_NAME="localhost"');
$this->assertEquals("localhost", $this->util->get_environment());
shell_exec('set SERVER_NAME="gitlab"');
$this->assertEquals("gitlab", $this->util->get_environment());
}
注意:我必须使用 set
,因为我在 Windows 机器上,而我们的 GitLab Runner 在 Linux 机器上,所以我使用了 export
在 gitlab-ci.yml
文件上。
我原以为这个测试会通过,但使用 shell_exec
设置环境变量的命令似乎根本没有改变值。我仍然从 YAML 文件中定义的值中获取值。
更新
这是失败信息:
1) UtilTest::testGetEnvironment
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'localhost'
+'gitlab'
最佳答案
您执行的任何 shell 命令都将是一个单独的进程,不会影响正在运行的进程。
由于您正在对函数如何使用 $_SERVER
变量进行单元测试,因此您无需考虑如何在“真实”场景中设置它的所有麻烦 - 只需手动修改它并测试你的功能:
public function testGetEnvironment() {
$_SERVER["SERVER_NAME"] = "localhost";
$this->assertEquals("localhost", $this->util->get_environment());
$_SERVER["SERVER_NAME"] = "gitlab";
$this->assertEquals("gitlab", $this->util->get_environment());
}
关于php - 在 PHP 单元测试中设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52393375/