如何让PHPUnit测试与返回IP的函数一起工作?

如何让PHPUnit测试与返回IP的函数一起工作?,php,phpunit,phpstorm,tdd,Php,Phpunit,Phpstorm,Tdd,我刚刚接触TDD,并且已经用PhpStorm安装了PHPUnit 我有这个类和函数,我想测试IP地址匹配 class ip_request { function getRealIpAddr() { if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet { $ip=$_SERVER['HTTP_CLIENT_IP'];

我刚刚接触TDD,并且已经用PhpStorm安装了PHPUnit

我有这个类和函数,我想测试IP地址匹配

class ip_request
{

    function getRealIpAddr()
    {
        if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
        {
            $ip=$_SERVER['HTTP_CLIENT_IP'];
        }
        elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
        {
            $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else
        {
            $ip=$_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
}
我正在尝试为测试创建代码,但我不确定要输入什么

我试过了

public function testGetRealIpAddr()
    {
        
        $expected = '127.0.0.1';
        $this->assertEquals($expected, $test);
    }
但是,
$test
显然是未定义的

接下来我该怎么办

提出的建议

public function testGetRealIpAddr()
    {
        $UserIpAddress = $this
            ->getMockBuilder('ip_request')
            ->getMock();

        $UserIpAddress->expects($this->once())
            ->method('getRealIpAddr')
            ->willReturn('127.0.0.1'); // Set ip address whatever you want to use
    }
但我现在得到的错误是

Trying to configure method "getRealIpAddr()" which cannot be configured because it does not exist, has not been specified, is final, or is static

要测试的方法/函数具有隐藏的依赖项:
$\u SERVER

发现这一点还可以找到一种解决方案,使代码更模块化,更易于测试

这通过使用可选参数公开先前隐藏的依赖项来实现:

function getRealIpAddr(array $server = null)
{
    $server ??= $_SERVER;
    
    if (!empty($server['HTTP_CLIENT_IP']))   //check ip from share internet
    {
        $ip = $server['HTTP_CLIENT_IP'];
    } elseif (!empty($server['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
        $ip = $server['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $server['REMOTE_ADDR'];
    }

    return $ip;
}
在单元测试中,然后根据输入测试函数结果


但是,单元测试不能突出显示函数所存在的大量安全问题,这可能超出了您的问题范围,因此我只留下一句话。

我按照@hakre的建议解决了这个问题

$ip = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1';
我添加了
??'127.0.0.1'
到该语句的末尾,这就解决了它

还刚刚更新了我的测试功能,只显示

 $local = new ip_request();
 $this->assertEquals('127.0.0.1', $local->getRealIpAddr());

这回答了你的问题吗?谢谢,我确实解决了这个问题,但是我很感谢你给我展示这个方法,谢谢。