在PHP单元测试中设置环境变量

4

我正在对我几年前编写的一个实用程序函数进行基本单元测试,但它涉及访问$_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());
}

注意: 我因为使用Windows机器,而我们的GitLab Runner是在Linux机器上,所以我必须使用set命令并在gitlab-ci.yml文件中使用export命令。

我本来期望这个测试能通过,但似乎使用shell_exec命令设置环境变量并没有改变它的值。我仍然得到了从YAML文件中定义的值。

更新

下面是失败信息:

1) UtilTest::testGetEnvironment
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'localhost'
+'gitlab'
1个回答

4
任何您执行的 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());
}

1
哇,真不敢相信我错过了那个。我把这个问题搞得太复杂了 - 我的错.. 非常感谢! - dokgu
你是指 $_SERVER 而不是 $SERVER,对吗? - Adam
@Adam 哎呀,是的,发现得好。已编辑并修复。 - Mureinik

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