【问题标题】:Setting environment variables inside PHP unit tests在 PHP 单元测试中设置环境变量
【发布时间】:2018-09-18 19:25:49
【问题描述】:

我正在对几年前创建的实用程序函数进行一些基本的单元测试,但它涉及访问$_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 机器上,所以我在 gitlab-ci.yml 文件上使用了export

我期待这个测试通过,但似乎使用shell_exec 设置环境变量的命令根本没有改变值。我仍然从 YAML 文件中定义的值中获取值。

更新

这是失败消息:

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

【问题讨论】:

    标签: php unit-testing environment-variables gitlab shell-exec


    【解决方案1】:

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

    【讨论】:

    • 哇,真不敢相信我错过了。我把这个弄得太复杂了——我的错……非常感谢!
    • 你的意思是 $_SERVER 而不是 $SERVER,对吧?
    • @Adam 哎呀,是的,很好。已编辑和修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多