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

时间:2018-09-18 19:25:50

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

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

注意::我的GitLab Runner在Linux计算机上时,我必须像在Windows计算机上一样使用set,所以我在{{1 }}文件。

我期望该测试通过,但似乎使用export设置环境变量的命令根本没有更改该值。我仍然可以从YAML文件中定义的值中获取价值。

更新

这是失败消息:

gitlab-ci.yml

1 个答案:

答案 0 :(得分:2)

Any shell command you execute would be a separate process and wouldn't affect the running process. Since you're unit testing how the function would use the $SERVER variable, you don't need to go through all the hassle of thinking how it would be set in a "real" scenario - just manually modify it and test your function:

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());
}