PHP单元无法识别$ _SERVER ['DOCUMENT_ROOT']

时间:2014-07-11 05:51:01

标签: php unit-testing phpunit

我正在用phpunit为我的代码编写单元测试。代码类有以下内容:

<?

    // Dependencies
    //
    require_once($_SERVER['DOCUMENT_ROOT']."/includes/configs.php");

class xyz{
..
...
..
}
?>

测试类如下:

<?php

require_once("xyz.php");

class testxyz extends PHPUnit_Framework_TestCase{

    public function setUp(){
        $this->xyz= new xyz();
    }

    public function testEmail(){

        $this->xyz->SetEmail('abc');
        $name = $this->xyz->GetEmail();
        $this->assertEquals($name == 'abc');
    }


}

当我在我的测试类上运行php单元时,出现以下错误:

Fatal Error: Class xyz not found

通过在我的代码类顶部提供<?php instead of <?来解决此错误。

其次,我在第一次错误解决后得到以下错误:

Fatal error: require_once(): Failed opening required '/includes/configs.php'.

这意味着php单元无法识别$ _SERVER [&#39; DOCUMENT_ROOT&#39;]。

由于代码类无法更改,如何在不更改代码类的情况下成功运行php单元。请建议任何解决方法<?$_SERVER['DOCUMENT_ROOT']开始使用php unit。

2 个答案:

答案 0 :(得分:1)

$_SERVER['DOCUMENT_ROOT']依赖于特定的环境。当你调用PHPUnit时,它运行没有那个环境的PHP。

通常,您希望测试中的代码独立于环境。一个常见的设置是拥有一个可以从Web服务器环境和PHPUnit环境引导的引导程序。

而是使用$_SERVER['DOCUMENT_ROOT'],您可以使用魔术常量设置引导程序中的基目录:__FILE____DIR__

$_SERVER类似:$_GET$_POST$_COOKIE在PHPUnit环境中也不可用。

答案 1 :(得分:0)

您可以在setUp方法中手动设置$ _SERVER [&#39; DOCUMENT_ROOT&#39;]

public function setUp(){
    $_SERVER['DOCUMENT_ROOT'] = "...";
    $this->xyz= new xyz();
}

未设置$ _SERVER的原因: https://stackoverflow.com/a/2100577/1071156